Fish-shell: Eval $ argv يفصل الحجج

تم إنشاؤها على ٧ يناير ٢٠١٧  ·  3تعليقات  ·  مصدر: fish-shell/fish-shell

  • [x] هل راجعت ما إذا كانت المشكلة تحدث مع الأسماك 2.4.0 ؟
  • [x] حاولت الأسماك بدون تخصيصات من طرف ثالث (ضع علامة في 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" للوظيفة؟ ماذا ينقصني؟

question

التعليق الأكثر فائدة

لاحظ أنه يمكنك حاليًا استخدام string escape ، أي eval (string escape -- $argv) .

ال 3 كومينتر

هذه مشكلة مع eval ، وليس "$ argv" على وجه الخصوص.

يوزع eval وسيطاته كما لو تم تقديمها في سطر الأوامر ، ولا يهتم بكيفية تقسيم الوسيطات.

كانت لدينا مشكلة حول هذا من قبل ، ولكن كان الإجماع أنه لا يمكننا تغيير التقييم الآن ، وأنه قد يجعل الأمور الأخرى أكثر تعقيدًا.

ما نحاول معرفته هو في # 154 - اجعل command ومثل هذه المتغيرات المقبولة.

هذا يعني أنه يمكنك إضافة command $argv ، وسيتم تشغيله كما تتوقع.

لاحظ أنه يمكنك حاليًا استخدام string escape ، أي eval (string escape -- $argv) .

شكر. (string escape -- $argv) .

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات