sh -c 'env HOME=$(mktemp -d) fish'
) ؟نسخة الأسماك المثبتة ( fish --version
) : 2.4.0
نظام التشغيل / المحطة المستخدمة : OSX 10.12.2 (16C67) / iTerm2 Build 3.0.13
لنفترض أن لدي برنامج نصي بسيط يقوم فقط بإخراج وسيطاته. يمكن أن يبدو مثل هذا:
#!/usr/bin/env ruby
p ARGV
ويبدو تنفيذه كالتالي:
> ./myscript.rb foo 'hello world'
["foo", "hello world"]
لاحظ كيف يتم تجميع "hello world" كحجة واحدة مقابل "hello" و "world" باعتبارهما وسيطين منفصلين.
الآن ، أريد أن أكتب وظيفة الأسماك التي تتيح لي تنفيذ أي أمر تعسفي للأسماك (بما في ذلك الأسماء المستعارة) مع إعداد بعض متغيرات ENV.
هذه هي محاولتي الأولى لمثل هذه الوظيفة
function debug
set -xg DEBUG 1
eval $argv
set -e DEBUG
end
إليك ما يحدث عندما أقوم بتشغيل البرنامج النصي الخاص بي من أعلى من خلال هذه الوظيفة:
> debug ./myscript.rb foo 'hello world'
["foo", "hello", "world"]
لاحظ أن حجة "hello world" المنفردة تحولت إلى "hello" و "world" ، وهذا ليس ما أردت.
لقد جربت أيضًا النهج التالي:
env DEBUG=1 fish -c "$argv"
التي أنتجت نفس النتيجة.
هل هناك أي طريقة لجعل مجموعة $argv
تحافظ على مجموعة "hello world" للوظيفة؟ ماذا ينقصني؟
هذه مشكلة مع eval
، وليس "$ argv" على وجه الخصوص.
يوزع eval
وسيطاته كما لو تم تقديمها في سطر الأوامر ، ولا يهتم بكيفية تقسيم الوسيطات.
كانت لدينا مشكلة حول هذا من قبل ، ولكن كان الإجماع أنه لا يمكننا تغيير التقييم الآن ، وأنه قد يجعل الأمور الأخرى أكثر تعقيدًا.
ما نحاول معرفته هو في # 154 - اجعل command
ومثل هذه المتغيرات المقبولة.
هذا يعني أنه يمكنك إضافة command $argv
، وسيتم تشغيله كما تتوقع.
لاحظ أنه يمكنك حاليًا استخدام string escape
، أي eval (string escape -- $argv)
.
شكر. (string escape -- $argv)
.
التعليق الأكثر فائدة
لاحظ أنه يمكنك حاليًا استخدام
string escape
، أيeval (string escape -- $argv)
.