Fish-shell: && لا يعمل

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

يُرجع cd .. && pwd الخطأ التالي:

fish: Expected a command name, got token of type 'Run job in background'. Did you mean 'COMMAND; and COMMAND'? See the help section for the 'and' builtin command by typing 'help and'.
cd .. && pwd

من الواضح أنه يمكنني استخدام صيغة COMMAND; and COMMAND ، لكن سيكون من الرائع لو دعمت الأسماك ذلك.

شكرا!

enhancement

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

|| سيكون أيضًا رائعًا.

ال 98 كومينتر

|| سيكون أيضًا رائعًا.

أريد فقط أن أعبر عن رأي بديل.
'||' و "&&" هي عناصر بناء الجملة ، بينما "و" و "أو" أوامر بسيطة. هذا النهج بسيط ونظيف.
أعتقد أنه ليس من الجيد تقديم عناصر بناء جملة إضافية لتنفيذ القدرة الموجودة بالفعل.
الأمر مختلف عن باش ، لكن لا بأس.

سأصوت أيضًا لامتلاك && و || لأن هذا هو السكر النحوي شائع الاستخدام وسيكون من الجيد حقًا أن تكون مكتوبًا على قابلية الاستخدام.

+1 لاقتراح maxfl.

+1 لاقتراح maxfl.

لدى روبي أيضًا كلمات رئيسية and و or .

+1

ليس لدي أي اعتراض إذا كان شخص ما يريد أن يأخذ هذا.

-1 لتنفيذ && / || و +1 إلى maxfl. وأنا لا أرى حقًا سبب تطبيقه. إنه ليس سكرًا نحويًا ، في bash هو مجرد بناء جملة وفي الأسماك هذه الصيغة غير موجودة. سيكون أيضًا عديم الفائدة حقًا مثل السكر النحوي مثل "؛ أو" يأخذ نفس عدد ضغطات المفاتيح مثل "||".

تعجبني بساطة الأوامر and و or ، لكن إحدى المشاكل هي أنها تجعل العبارات غريبة. فمثلا:

if begin ; [ a = b ] ; and [ c = d ] ; end
   ...

مقارنة ب

if [ a = b ] && [ c = d ]
    ...

أي شخص لديه أفكار لتحسين ذلك؟

if test a = b -a c = d # or [ ] syntax, but I didn't particularly liked it
    ...

ولكن في حين أن هذا يعمل مقابل test مدمج ، فإنه لا يعمل في أي مكان آخر. لنفترض أن العناصر المدمجة a و b يجب أن تعود صحيحة لتشغيل c و d . ثم يمكننا كتابتها على هذا النحو.

and b
and begin
    c
    d
end

أو باستخدام تركيب الكتلة و if .

if begin
        a
        and b
    end
    c
    d
end

أو جعل متداخلة شرطية.

if a
    if b
        c
        d
    end
end

ثم مرة أخرى ، لست متأكدًا من عدد المرات المطلوبة لهذا الاختراق ، لكن searchco.de تقول أن && يستخدم في الغالب مع test مدمج (أو للآثار الجانبية).

لست متأكدًا حقًا مما إذا كان fish سيحتاج إلى صيغة أخرى مفيدة فقط في حالات نادرة. يبدو الأمر بالفعل وكأنه [ ، باستثناء أنه كان على المرء أن يبقى لأنه ثنائي على أي حال (تمامًا مثل test ). لا يبدو الأمر مريبًا بشكل خاص ، ولكنه موجود هنا ، لأنه ثنائي (على عكس [[ الذي يسعدني أن الأسماك لا تدعمه).

سيكون وجود صيغتين (أو في هذه الحالة ، حتى ثلاثة) أمرًا محيرًا. ما هي الصيغة التي يجب أن أستخدمها؟

if a
    b
end
a; and b
a && b

يبدو أن الأقصر && ، باستثناء أن هذا نصف الحقيقة. تتطلب كتابة ;and نفس عدد ضغطات المفاتيح بالضبط (لأن & يتضمن Shift). ستشجع إضافة && إضافة بناء جملة إضافي (ثم مرة أخرى ، and هو نوع من التحليل بطريقة خاصة ، لأنه يمكنك إدراج كلمات رئيسية مثل begin بعدها ، وهي تعمل).

تكمن المشكلة في أن لدينا بناء جملة ; and و ; or - تبدو الصيغ الجديدة مثل التكرارات. إنها بالفعل نوعًا من السحرية (فهي ليست مجرد وظيفة نصية صدفة تتحقق من متغير $status ) ، لذلك لن أواجه مشكلة إذا تم استبدالها بـ && و || .

لست متأكدًا مما أفكر فيه. أعتقد أنه يجب أن يكون هناك بناء جملة واحد فقط للقيام بذلك. أحب ; and و ; or ، لكن لن أواجه مشكلة مع && و || ، بشرط إزالة الصيغ القديمة. ولكن بالنظر إلى التوافق العكسي ، أفضل البقاء مع ; and و ; or . ربما إذا كان begin سيكون أقصر (مثل الأقواس في bash) ... لكن هذا لن يكون مريبًا.

لماذا لا تدعم مدمج [[مثل باش؟ سيكون أسرع (انظر: صدى مدمج) وسيدعم && و || عوامل التشغيل داخل [و]] لمحاكاة و / أو السلوك.

نظرًا لأن [[ ليس أمرًا فعليًا ، فهو موجود فقط في bash. تكمن المشكلة في أن [[ يشبه [ (في الغالب) ، باستثناء أنه يحتوي على قواعد تحليل خاصة لتجنب الاقتباس غير الضروري. راجع قانون التعامد وقانون القابلية للاكتشاف لمعرفة سبب عدم وجودها في الأسماك.

في الواقع ، أنا متأكد تقريبًا من عدم وجود [ بسبب قانون القابلية للاكتشاف وقانون التعامد ، لكنه موجود لأنه ثنائي في /usr/bin . test أكثر مريبًا ، لأنه يمكنك اكتشافه باستخدام علامة التبويب المكتملة. لكن حظر الثنائيات سيكون تعسفيًا إلى حد ما ، لذا قد يتم تنفيذه أيضًا كما هو مدمج.

على سبيل المثال ، في bash [[ يقتبس جميع السلاسل تلقائيًا.

[[ abc = $variable ]]

لكن هذا ليس ضروريًا في الأسماك لأن سلوك تقسيم المسافات البيضاء غير موجود. أيضًا ، يقتبس تلقائيًا && و || و < و > لأنه ميزة نحوية. في الأسماك ، يكون && هو -a ، || هو -o . < و > غير موجودين أصلاً.

كما أن لديها عامل تشغيل =~ . في fish ، يمكنك استخدام الهدوء grep لذلك.

echo $ANSWER | grep -qE '^y(es)?$'

أيضًا ، bash لديه عامل تشغيل < و > . يتحققون من أي سلسلة أكبر أو أصغر من السلسلة الأخرى. نادرًا ما يكون هذا مفيدًا.

وعند استخدام عوامل التشغيل = و != يمكنك استخدام صيغة globing ، تمامًا كما تستخدم التعبيرات العادية. مرة أخرى ، استخدم grep الهادئ لذلك.

[[ abc = a* ]]

أيضًا ، تم تعريف [[ ليكون -e ، -nt ، -ot ، -ef ، و ! ، لكن الأسماك لديها بالفعل هذه في test بنيت.

ستؤدي إضافة [[ فقط إلى إضافة كلمة رئيسية أخرى ، والتي لن تكون قابلة للاكتشاف حقًا ، ولن تضيف الكثير من الوظائف. الوظيفة الوحيدة المثيرة للاهتمام هي =~ ، لكن grep الهادئ (أو Perl) يمكنه فعل الشيء نفسه ، دون إضافة بناء جملة جديد. علاوة على ذلك ، لا ينبغي أن نضيف كل شيء إلى القشرة. لا أعتقد أننا بحاجة إلى أن يكون لدينا تعبير منتظم.

حسنًا ، لم أقصد بالضرورة أنه يجب علينا إعادة تطبيق bash [[ المدمج ، ولكن بدلاً من ذلك ، يجب تقديمه كبناء نحوي بخصائصه الخاصة. أعني ، تشارك الأسماك الكثير من الكلمات الرئيسية والتركيبات التي تشبه كلمات bash ، لكنها مختلفة ، لذلك ، لا أرى كيف لن يكون الأمر على هذا النحو.

على الرغم من أنه بناءً على ما قلته ، ربما يكون تنفيذ test هو بناء أفضل ، على الرغم من إعادة تسميته إلى شيء مثل cond ، مثل كيفية تنفيذ الأسماك لـ math مدمج بدلاً من ذلك من expr . يمكننا حتى أن نذهب إلى نقطة تنفيذ أشياء مثل <و> ، مع ذلك ، باستخدام الفرز الطبيعي (الرقمي) بدلاً من الفرز المعجمي ، بحيث يعمل على الأرقام وكذلك السلاسل.

Undeterminant builtin [[vs
أيضًا ، روح باش [[تنتهك قانون التعامد - إنها "تصلح" و / أو لكن فقط لشروط محددة يدعمها البناء.

من المفارقات أن bash's if commands...; then ...; fi سوف يعترف بسهولة بالأسماك و / أو بين if...then . لكننا لا نريد "إذن". ربما يكون الشيء الذي يجب إصلاحه هو جعل البداية ... النهاية أسهل.

إليكم فكرة غريبة (لست متأكدًا على الإطلاق من إعجابي بها):

if (foo; and bar)
  ...
end

حاليًا (...) عند بدء الأمر غير قانوني ؛ القراءة الطبيعية هي تنفيذ هذا واستخدام الإخراج كاسم أمر لكننا نطلب eval لذلك.
إذا كنا واثقين من أننا لن نسمح أبدًا بهذه القراءة مباشرة ، فيمكننا إعادة الغرض من استخدام (...) ليعني begin ...; end .
إن عدم التقاط صور stdout في هذا الموضع غير متناسق - ولكنه يبدو مضغوطًا جدًا ونظيفًا.

ما أكرهه هو أن if (...) يطرح معنى آخر: قم بالتقاط المخرجات وخصص لها بعض التفسير المنطقي. على سبيل المثال ، if (math 2 \< 4) - math لا يُرجع حالة ، فإنه يطبع 0 أو 1 إلى stdout. أحد الاستخدامات المهمة هو if $saved_bool .
لا أعتقد أن هذا عملي - لا يوجد تخصيص واحد صحيح للمعاني المنطقية للسلاسل ، خاصة وأن 0/1 مشوش بشكل ميؤوس منه. ولكن عندما تواجه if (...) لأول مرة ، يبدو هذا تخمينًا معقولًا.

من أجل التوافق ، يرجى تقديم عوامل التشغيل الشائعة الموجودة في bash و zsh. كلما أصبح من الأسهل على المستخدمين الجدد نسخ ولصق معظم وظائف الغلاف السابقة ، كان معدل امتصاص الأسماك أفضل. أجد أنه على الرغم من أنني أحب الأسماك بشكل أفضل في كثير من النواحي ، إلا أن بعض هذه العقبات الصغيرة السخيفة تجعلها أكثر صعوبة من كونها فائدة عندما تأتي مع أكثر من 15 عامًا من تخصيصات الصدفة التي لا ينبغي أن تكون مشكلة في الدعم .

أنا بصراحة لا أرى && أنه "عقبة صغيرة سخيفة". لن يكون من الصعب معرفة ما إذا كنت تتعامل مع الأسماك كلغة خاصة بها بدلاً من "قوقعة بديلة" مثل zsh. إذا قرأت البرنامج التعليمي حول كيفية عمل الأسماك من البداية إلى النهاية ، فلا أعتقد أنه من الصعب فهم ذلك.

وجود شيء مثل command1; and command2 يجعل الأمر أكثر وضوحًا أن and هو تنفيذ مشروط لـ command2 وليس فقط بعض الانضمام بين command1 و command2 .

لكن @ غير محدد ، أنت لا تراه كما يراه معظم الناس في البداية عندما يكتشفونه في البداية ، وما إلى ذلك. دع هذا الشعور أو مستوى الكفاءة يأتي مع مرور الوقت. على سبيل المثال ، لقد أحضرت مئات الأسطر من التكوين القديم القديم وبصراحة ليس لدي الوقت لتحويل كل شيء على الفور يحتاج إلى تحويل. أجد شذوذًا حيث لا يوجد رقم سطر يعود من الأسماك فيما يتعلق بمكان مشكلتي داخل التكوينات القديمة.

أستطيع أن أفهم وجهة نظرك ، لكنها منحازة فيما يتعلق بشخص يريد إجراء التغيير ويرغب في القيام بذلك بمرور الوقت مقابل تجاوز حدب كبير. من فضلك لا تسيء الفهم ، إذا لم أكن أهتم بالأسماك وبالتالي حاولت تقديم مدخلات ، فسأعود بالتأكيد إلى zsh الآن. أشعر أن هذا النوع من التفكير والتفكير مهم لفتح الباب أكثر قليلاً للقادمين الجدد.

لذا ، نعم ، أنت محق بشأن قابلية القراءة ، لكن دعنا نترك العمل القديم ونعطي تحذيرًا بدلاً من الخطأ لفطم الناس.

ylluminate أنت تخدع نفسك. حتى إذا كانت الأسماك تدعم && فلا يزال بإمكانك استخدام التكوين الخاص بك من bash أو zsh ، نظرًا لوجود اختلافات في بنية البرمجة أكثر من مجرد العوامل المنطقية.

بالضبط. الأسماك مختلفة وظيفيًا ، مما يعني أنه لا يجب عليك نسخ الكود ولصقه مباشرةً. إذا كانت التعليمات البرمجية الخاصة بك مكتوبة بلغة bash ، ما لم تكن هناك حاجة صريحة لتحويلها إلى سمك ، فما عليك سوى الاحتفاظ بها كـ bash ؛ إنها لغات منفصلة.

لذا
إذا فعلت
command1 && command2
في الأسماك يقترح أن أكتب بدلاً من ذلك
القيادة 1 ؛ والقيادة 2

هل يعتقد شخص ما حقًا (في سطر الأوامر) أن الخيار الثاني هو أنظف وأكثر مستقبلية وأسهل في الكتابة؟

إنه أنظف ، لأنه يبني على بناء الجملة الحالي لتنفيذ الأوامر ، بدلاً من إدخال بناء جملة جديد.

ضع في اعتبارك في باش:

foo & bar # executes foo in the background, then bar in the foreground
foo && bar # executes foo in the foreground, then executes bar if foo has a zero exit status
foo & bar && baz & qux # left as an exercise for the reader

هذا هو نوع الهراء الذي نأمل تجنبه باستخدام الأوامر بدلاً من بناء الجملة الخاص.

من المؤكد أن قرار التصميم هذا ينطوي على تكلفة ، خاصةً في العبارات ، والتي يجب أن نحاول تقليلها. ولكن يجب أن نتعامل معها من موقف "فلنجد طرقًا لتحسين الأسماك في إطار فلسفة التصميم الخاصة بها" بدلاً من "دعونا نجد طرقًا لجعل الأسماك أكثر تشابهًا مع الأصداف الأخرى".

الكود الخاص بك يقوم بما يلي ، صحيح (بافتراض أنه يمكنك استخدام & مع الكتل)؟

foo &
if bar
    baz
end &
qux

بالنسبة لي ، يبدو أنه مفتعل. أيضًا ، إذا كان بناء الجملة & محيرًا جدًا ، فلماذا لا يتم إنشاء background ، أو شيء من هذا القبيل؟

أعتقد أن هذه حجة بالفعل لجعل الخلفية مضمنة ، على الرغم من أنني لا أقترح القيام بذلك بالفعل.

مشكلة ; and و ; or هي أنهم يتفاعلون بشكل سيء مع الأنابيب. condition; and echo stuff | grep stuff لا يعمل ، بينما condition && echo stuff | grep stuff لا يعمل. لا أرى أي طريقة للتغلب على هذه المشكلة باستثناء إضافة بناء جملة خاص.

يبدو أن and echo stuff | grep stuff يعمل بالنسبة لي. هل يمكنك توضيح كيفية تعطله؟

ridiculousfish هذه هي الحالة التي اكتشفتها عند تجربة الأسماك. يكون التعبير or صحيحًا خارج تعليمة if ولكن (يبدو أنه؟) خطأ عند استخدامه في عبارة if. ما لم أفقد شيئا هنا؟

root@smogon-dev ~# test 0 = 1; or echo stuff | grep stuff
stuff
root@smogon-dev ~# echo $status
0
root@smogon-dev ~# if test 0 = 1; or echo stuff | grep stuff
                       echo Success
                   else
                       echo Failure
                   end
Failure

قارن مع باش:

~/smogon/bin$ [[ 0 == 1 ]] || echo stuff | grep stuff
stuff
~/smogon/bin$ echo $?
0
~/smogon/bin$ if [[ 0 == 1 ]] || echo stuff | grep stuff; then
> echo Success
> else
> echo Failure
> fi
stuff
Success

في هذه الحالة:

if test 0 = 1; or echo stuff | grep stuff

قد يكون أكثر وضوحًا إذا تمت كتابته على هذا النحو:

if test 0 = 1
    or echo stuff | grep stuff
    ...

بيان or موجود في نص if! نظرًا لأن القيم المنطقية هي أوامر ، فليس لها أسبقية خاصة.

يمكنك استخدام start / end كـ "قوس":

if begin; test 0 = 1; or echo stuff | grep stuff ; end
    ...

لذلك أعتقد أن الأمر لا يتعلق بالأنابيب ، بل بالأسبقية.

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

لذا ، شكرًا يا رفاق على الطاقة الموضوعة هنا.

لا أقصد طرح النقاش حول أي الأشياء أفضل أم لا. إنه مجرد شيء عملي.
مثل معظمكم ، لدي البرامج النصية الخاصة بي لتشغيلها. يضمن الشرط && حتى في الأمور البسيطة جدًا نجاح الأمر (خروج 0) ، بينما "؛" فقط انطلق دون الاهتمام بما حدث. حق؟ لذا ، فهم ليسوا متشابهين على الإطلاق. آمل أن نتفق جميعًا على هذا. :)

لذلك ، لدي نصوصي ولا يعمل أي منها مع الأسماك. نعم ، أستخدم الكثير &&. ولكن هذا يحدث أيضًا مع أي سلام برمجي عبر الشبكة باستخدام bash ، بشكل عام باستخدام && أيضًا. لجعلها قصيرة ، الشيء هو أنني لا أستطيع استخدام أكواد بلدي بعد الآن! :د

كنت أتساءل ... هل من الممكن إنشاء وظيفة أو تعريف في ملف تهيئة الأسماك لإصلاح هذا السلوك فقط (بمعنى &&) وإعادته كما هو الحال في bash التقليدي؟ هل هو ممكن؟ معقول؟ ممكن؟

مرة أخرى ، أوافق على أن استخدام "و" قد يكون أجمل وأوضح. لكنها لا تعمل مع الكود الخاص بي أو بشكل عام مع أي كود bash أعلى من المبتدئين. لذا فبدلاً من تغيير الكود المكتوب بالفعل لاستبدال && (... لن يحدث ... وعلى الأرجح لن يعمل) ، سيكون من الأسهل السماح للأسماك بفهم bash التقليدي إذا أراد شخص ما ، أو احتاج ، أليس كذلك؟

كل التوفيق يا رفاق ، وشكرا مرة أخرى على هذا الجهد !!

هل اقتربنا يومًا من الاكتمال مع البرامج النصية bash / zsh ؟ لقد تخليت عن fish وفقًا لتعليقاتي السابقة لأنني لن أستغرق الوقت الكافي لتحويل جميع البنية التحتية التي أنشأتها بالفعل في بيئات shell الخاصة بي عبر العديد من محطات العمل والخوادم. أود أن أجربها مرة أخرى إذا كنا أقرب. وإلا سأستمر في التجوال بدونها. شكرا.

rhoconlinux Changing Fish لدعم && لن يجعل برامج bash الخاصة بك تعمل. هناك اختلافات أكثر من ذلك بكثير.

لم أفهم إجابتك ^ _ ^
هل من الممكن تحديد اسم مستعار أو دالة لمشكلة &&؟

rhoconlinux لا ، يجب عليك تعديل محلل الأسماك (في C ++). وجهة نظري هي ، إذا كان Fish يدعم && ، فإن نصوص Bash الخاصة بك ستظل تفشل في العمل ، بسبب جميع الاختلافات الأخرى بين Fish و Bash.

تضمين التغريدة هممم .... أنا حزين جدًا لسماع هذا. حصلت عليها الان. فائقة الوضوح. :)

شكرا لردود الفعل فائقة السرعة. سأستخدم الأسماك لتجربة يومية أفضل وسأحتفظ بمحطة bash لأشراضي بعد ذلك.

هتافات! : +1:

إذا كان && يمثل مصدر قلق ، فمن السهل التعامل معه.

sed 's/&&/; and /' ~/.bashrc > ~/.config/fish/config.fish

لكن من غير المحتمل أن يكون هذا هو الشيء الوحيد الذي ستحتاج إلى القيام به. ما تعنيه هو تنفيذ رقم 522.

أود أن أقول إن الدافع الرئيسي للتوافق && التوافق هو عدم تحويل الموجود
ولكن نسخ ولصق من الإنترنت.
على سبيل المثال ، أرى بعض المقتطفات sudo add-apt-repo... && sudo apt-get update && sudo apt-get install ... ، وأريد نسخها ولصقها فقط ولكنها فشلت.

هذا ليس شيئًا يمكننا حله من خلال التعليم - سيكون هناك دائمًا
المقتطفات المراد لصقها ، وسيستخدمون بنية [ba] sh القياسية.
و && هي المشكلة رقم 1 التي أواجهها.
( export FOO=bar هو رقم 2 ولكن يمكن حله عن طريق function export; set -x -g (echo $argv | sed 's/=/\n/'); end .)

إنها ليست مشكلة عميقة: لقد اعتدت على الكتابة
bash لصق Ctrl + D.
حسنًا ، أنا أميل إلى إضافة اختصار لوحة مفاتيح لتشغيل الحالي / السابق
كوماندلاين تحت باش.

سنتي على هذه القضية:
أنا أعمل على أداة نشر (https://github.com/andres-montanez/Magallanes) تقوم بإجراء استدعاءات أوامر shell ، وسيستخدم غالبية المستخدمين والمساهمين قذيفة bash. لذلك بالطبع ، يتم استخدام "&&" هنا وهناك لتسلسل الأوامر معًا.

هناك حلول واضحة (مثل تمرير جميع الأوامر صراحة إلى bash)
لكن هذا يأتي بعدد من نقاط الألم. أولاً ، يمكن أن تكون هناك آثار جانبية غريبة (على سبيل المثال ، لم يتم تحديد المسار والمتغيرات الأخرى بنفس الطريقة) ، فهذا يعني اختراق بعض الأجزاء الأساسية من الأداة لهذا الغرض الوحيد ، وأحتاج إلى دمج إصلاحاتي من إصدار إلى إصدار في كل مرة أقوم بالتحديث.

&& هي واحدة فقط من العديد من ميزات bash التي لا تتوافق معها الأسماك ، ولكنها قد تكون الميزة الأساسية والمستخدمة على نطاق واسع. على سبيل المثال ، الأداة المذكورة أعلاه موجودة في PHP ، لذلك يتم تنفيذ أي شيء معقد متوسط ​​في PHP ويتم تمرير أوامر النظام الأساسية فقط إلى shell. يعد ضرب عدم التوافق النحوي مع حالة استخدام قليلة جدًا أمرًا محبطًا.

أتفق تمامًا مع ما قاله cben إن && هو في رأيي حالة خاصة لأن هناك مئات من مقتطفات التعليمات البرمجية عبر الإنترنت حيث يكون الاختلاف الوحيد بين النسخ واللصق أو عدمه هو دعم && .
على الرغم من أنني أوافق على أنه من المهم مراعاة كيفية تقدم الأسماك من حيث التركيب اللغوي ، وما إلى ذلك ، أعتقد أن هذا شيء من شأنه أن يجعل حياة العديد من المطورين الذين يستخدمون الأسماك أو يرغبون في استخدامها أسهل بكثير. أعلم أنه يبدو وكأنه مجرد استبدال بسيط && بـ ; and لكنه مزعج دائمًا ويجعله محرجًا بعض الشيء عندما أخبر الآخرين بمدى روعة الأسماك ولكن بعد ذلك يجب أن أتلاعب وتغيير بعض الكلمات الرئيسية ، فعادةً ما يتساءلون عن سبب وجودي لتغيير هذا الشيء البسيط. ثم يتعين علي الدفاع عن الأسماك وهذا لا يمثل قضية جيدة للترويج للأسماك.
في بعض الأحيان ، تكون أبسط الأشياء حقًا هي التي يمكن أن يكون لها تأثير أكبر.
باختصار ، أنا جميعًا أسمح بتركيب bash && .

أتفق مع ما قاله Globegitter و cben . تعتمد كمية كبيرة من النصوص والبرامج على && و || . أستخدم قوقعة السمكة في محطة العمل الخاصة بي وسيكون من الجيد أن يكون لديك توافق عبر الصدفة عند كتابة البرامج النصية.

نظرًا لوجود الكثير من الاختلافات الكبيرة بين البرمجة النصية لـ Fish و Bash بما يتجاوز && و || ، فلماذا تعتقدون جميعًا الذين يعلقون هنا أن جعل Fish يقبل && شأنه أن تكون ذات معنى بأي شكل من الأشكال؟ إذا كنت بحاجة إلى تشغيل مقتطف من كود Bash ، فما عليك سوى تشغيل bash ، وتنفيذ المقتطف ، ثم الخروج مرة أخرى إلى Fish.

أعتقد أن الكثير من الناس يرغبون في "التحول" إلى أسماك ، لكن لديهم بنية تحتية لإحضارها. على سبيل المثال ، لدي 15 عامًا من نصوص الشل على محطة العمل الخاصة بي فقط (ناهيك عن الخوادم الأخرى التي أود تشغيل الأسماك عليها أيضًا) والتي لا أريد قضاء الوقت في التحويل. لا أمانع في البحث عن الأشياء وجعلها تعمل بطريقة "طريقة الصيد" على مدار عدة أشهر ، ولكن لا توجد طريقة يمكنني من خلالها إجراء هذا النوع من الاستثمار الأولي في سير العمل الخاص بي للتغيير إلى هيكل آخر.

أعتقد أن الأسماك سيكون لها تدفق كبير من المستخدمين إذا تم معالجة مشكلة التوافق العامة ، ولكن لا يبدو أن هذا يمثل أولوية بالنسبة للمشروع مما يقوله الآخرون الذين يعملون في تطوير الأسماك. أضع عيني على هذا لهذا السبب بالذات لأنني أرغب في النهاية في الانتقال للصيد إذا تغير المشهد في هذا الصدد.

فيما يتعلق فقط بتشغيل bash أو zsh حسب الحاجة ، سيكون هذا قدرًا كبيرًا من تشغيل هذه الأصداف في حالتي وسيكون من السخف السير في هذا المسار بخلاف ذلك.

kballard لدي سير عمل مثالي لـ 95٪ من البرمجة النصية التي bash أو أي شيء آخر ، لا شيء آخر. في معظم الأحيان ، يكون الشيء الوحيد الذي يمنع هذه البرامج النصية من العمل مع سير العمل هذا هو وجود && الحالي. لذلك هذا هو السبب بالنسبة لي وأنا أفترض أن معظم الآخرين الموجودين هنا لحل هذه المشكلة سيكون مفيدًا للغاية.
إذا لم تختبر ذلك بنفسك ، صدقني أنه يضيف شيئًا ويلتصق حقًا بعقلك إذا تمت مقاطعة سير عملك كثيرًا.

أنا أحب السمك لكل شيء آخر ولهذا السبب لم أستطع العودة إلى الوراء ، لكن هذا الشيء البسيط هو ما يمنعه من أن يكون رائعًا بالنسبة لي وأعتقد أن بعضًا من الآخرين هنا.

ها أنت ذا. بمجرد هبوط PR # 1633 ، يمكنك أخذ ما يلي وحفظه في ~/.config/fish/functions/fish_user_key_bindings.fish :

function handle_input_bash_conditional --description 'Function used for binding to replace && and ||'
    # This function is expected to be called with a single argument of either & or |
    # The argument indicates which key was pressed to invoke this function
    if begin; commandline --search-mode; or commandline --paging-mode; end
        # search or paging mode; use normal behavior
        commandline -i $argv[1]
        return
    end
    # is our cursor positioned after a '&'/'|'?
    switch (commandline -c)[-1]
    case \*$argv[1]
        # experimentally, `commandline -t` only prints string-type tokens,
        # so it prints nothing for the background operator. We need -c as well
        # so if the cursor is after & in `&wat` it doesn't print "wat".
        if test -z (commandline -c -t)[-1]
            # Ideally we'd just emit a backspace and then insert the text
            # but injected readline functions run after any commandline modifications.
            # So instead we have to build the new commandline
            #
            # NB: We could really use some string manipulation operators and some basic math support.
            # The `math` function is actually a wrawpper around `bc` which is kind of terrible.
            # Instead we're going to use `expr`, which is a bit lighter-weight.

            # get the cursor position
            set -l count (commandline -C)
            # calculate count-1 and count+1 to give to `cut`
            set -l prefix (expr $count - 1)
            set -l suffix (expr $count + 1)
            # cut doesn't like 1-0 so we need to special-case that
            set -l cutlist 1-$prefix,$suffix-
            if test "$prefix" = 0
                set cutlist $suffix-
            end
            commandline (commandline | cut -c $cutlist)
            commandline -C $prefix
            if test $argv[1] = '&'
                commandline -i '; and '
            else
                commandline -i '; or '
            end
            return
        end
    end
    # no special behavior, insert the character
    commandline -i $argv[1]
end

function fish_user_key_bindings
    bind \& 'handle_input_bash_conditional \&'
    bind \| 'handle_input_bash_conditional \|'
end

يؤدي هذا إلى ربط & و | ، مما يجعل كتابة && أو || يترجمها تلقائيًا إلى ; and / ; or ، مما يتيح لك لصق سطور النموذج command one && command two وتشغيلها.

لاحظ أنه حتى يتم قبول PR # 1633 ، سيعمل هذا البرنامج النصي مع _typing_ && / || ولكنه لا يعمل للصقه.

kballard واو ، هذه أخبار رائعة! شكرا جزيلا لك.

يبدو أن هذا لا يتعامل فعليًا مع وضع البحث بشكل صحيح (لست متأكدًا من وضع بيجر ؛ لست واضحًا فيما يتعلق بالضبط بما يشتمل عليه). يؤدي الضغط على & أو | أثناء البحث إلى إنهاء البحث. بعد قولي هذا ، لا أعرف كيف أتعامل مع ذلك.

لقد قمت بتحديث البرنامج النصي باستخدام إصلاح خطأ لكتابة | أو & في أمر متعدد الأسطر.

kballard رأيت أن العلاقات العامة قد هبطت. إذن ، يجب أن يجعل البرنامج النصي الذي لصقته أعلاه && يعمل مع أحدث سيد؟

نعم ينبغي. جربه وأخبرني إذا كان لديك أي مشاكل.

كيفن

في 1 سبتمبر 2014 ، الساعة 1:14 صباحًا ، كتب Markus Padourek [email protected] :

kballard رأيت أن العلاقات العامة قد هبطت. إذن ، يجب أن يقوم البرنامج النصي الذي لصقته أعلاه بعمل && عمل مع أحدث معلم؟

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub.

لقد جربت هذا البرنامج النصي مع الإصدار 2.1.1 الجديد الذي تم إصداره منذ بضعة أيام ، ولا يبدو أنه يعمل. هل سأضطر إلى الانتظار حتى 2.2؟ شكرا!

pragmattica : إصلاح الأخطاء الأمنية. لم تضف أي ميزات جديدة.

xfix : حسنًا. شكرا على إعلامي. لا استطيع الانتظار حتى 2.2!

رهيبة: +1:

أي تغيير قيد التشغيل متاح؟ يبدو أن الجذر CHANGELOG تمامًا.

pragmattica الآن بعد أن echo 'test1' && echo 'test2'; يتحول إلى echo test1 &; and echo 'test2';

هل يمكن أن تكون هناك مشكلة في مكان ما ضمن fish_user_key_bindings.fish ؟ (سأحاول النظر في الأمر بنفسي ، لكن معرفتي بالنصوص السمكية / باش مهتزة بعض الشيء)

تحرير: يبدو أنه يعمل ولكن عندما تكتب أمرًا باستخدام && . قد يكون من الجيد بعض الشيء أن يحدث ذلك في المساحات اللاحقة لكن هذا ليس مهمًا حقًا. رائع أن هذا النصف يعمل :)

-1 لرموز غريبة :

if [[ a = b ]]; and [[ b = a ]]; or [[ c = b ]]; then echo hello; and echo world; done

+1 للرموز البسيطة :

if [[ a = b ]] && [[ b = a ]] || [[ c = b ]]; then echo hello && echo world; done

Aaahhh أعتقد أنني أعرف ما هي المشكلة pragmattica ، الأمر commandline يعيد المخزن المؤقت بدون أي علامات اقتباس. نعم يبدو أن الأمر كذلك. لذلك بمجرد إصلاح https://github.com/fish-shell/fish-shell/issues/2210 ، يجب إصلاح البرنامج النصي أعلاه أيضًا.

هل لا يزال هذا يبدأ النظر؟

+1
الرموز ليست غريبة ، فهي تستخدم عادة للمنطق في عدد كبير من لغات البرمجة.
توافق النسخ واللصق هو حجة حقيقية للغاية ، وأنا أؤيدها.

سأكون الرجل السيئ وأختتم هذه المناقشة. لن يتم تنفيذ هذا. أنا منزعج بشكل خاص من العبارات المتكررة حول الرغبة في أن أكون قادرًا على "قص ولصق أوامر من نصوص bash النصية". حتى لو كانت fish تدعم المشغلين && و || فلن تضمن لك ببساطة قص ولصق البيانات التي تحتوي على هذه العوامل. لا نريد أن نعطي الانطباع بأنه يمكنك فعل ذلك. بصراحة ، إذا كنت تريد بنية وسلوك bash / zsh ، فيجب عليك استخدام تلك الأصداف (أو بديل يدعي التوافق معها).

يجب أن يكون لمعظم الأفكار الأخرى التي تمت مناقشتها قضاياها الخاصة. على وجه الخصوص ، قد يكون هناك بعض المزايا لتنفيذ بعض السلوكيات [[ ... ]] التي تم تقديمها لأول مرة بواسطة ksh88 (وليس bash). ولكن ربما عن طريق تعزيز الأمر المدمج test أو أمر جديد بدلاً من تنفيذ تلك الرموز المميزة.

ما زلت منزعجًا جدًا من فكرة عدم دعم zsh و bash. أستطيع أن أفهم المنطق ، لكنني لا أتفق معه. كنت مهتمًا جدًا بالسمك منذ بعض الوقت ، لكنني تراجعت بسبب هذه المعارضة. قد تكون هناك بعض الفرص لتقسيم المشروع هنا إذا كان هناك ما يكفي منا ، كمطورين ، الذين يرغبون في رؤية هذا التنفيذ. من المحزن رؤية هذه المقاومة المستمرة التي تعيق في النهاية الزخم الأمامي وقبول مثل هذا العمل المثير للاهتمام.

ylluminate ما الذي

ما زلت منزعجًا جدًا من فكرة عدم دعم zsh و bash. أستطيع أن أفهم المنطق ...

أخشى أنني لا أفهم منطقك لوجود ميزات bash و zsh تدعم الأسماك. إذا كنت تريد Java فلماذا تستخدم C ++؟ إذا كنت تريد لغة Perl فلماذا تستخدم Python؟ كما سأل ridiculousfish للتو ، إلى جانب بعض السكر النحوي ، ما الذي يجب أن تدعمه الأسماك أيضًا لتجعلك سعيدًا؟ في أي مرحلة تصبح الأسماك مجرد استنساخ آخر للباش؟

ملاحظة ، أنا أبرمج من أجل لقمة العيش منذ عام 1979 وأستخدم UNIX منذ منتصف الثمانينيات. لقد استخدمت العديد من القذائف التي فقدت العدد (على سبيل المثال ، Bourne ، Csh ، Ksh88 ، Ksh93 ، Bash ، Zsh ، Xonsh). يتطلب تبديل القذائف دائمًا العمل (وهذا هو السبب في أنني لا أفعل ذلك أكثر من مرة كل خمس سنوات أو نحو ذلك). عندما أفعل ذلك ، لا أشكو من أن قشرتي الجديدة لا تشغل كل نصوصي القديمة دون تغيير.

@ krader1961 كلام جميل. في رأيي المتواضع ...

لن أفعل البرمجة النصية في الأسماك طوال الوقت (متبوعة بالأوامر):

  1. نص السمك بطيء (أبطأ من mksh)
  2. بعض الصيغ الغريبة (على سبيل المثال ، ; and ، ; or الذي يبدو قبيحًا بالنسبة لي)
  3. غير متوافق مع posix (يمكنني القول أن بناء الجملة سهل ولكن ما زلت بحاجة إلى وقت للتعلم)

حسنًا ، لا يهمني 2 و 3 إلا إذا كان نص الأسماك أسرع من الأصداف الأخرى (على سبيل المثال. mksh ، bash).

من ناحية أخرى ، أستخدم الأسماك للأسباب التالية:

  1. وقت بدء التشغيل أسرع من zsh (لكن أبطأ من bash)
  2. لديك الكثير من الميزات التي تم تمكينها افتراضيًا (تمييز بناء الجملة هو الأفضل)
  3. التكوينات لطيفة وبسيطة (خاصة set -Ux )

ylluminate بالنظر إلى هذه المشكلة التي تبلغ من العمر أربع سنوات ، يمكنني أن أرى كيف أن الأشخاص الذين يرغبون في الاستمتاع بالأسماك مثل باش كسالى / مشغولون ما زالوا كسالى / مشغولين. لقد كان المتحمسون يصنعون قوقعتهم الخاصة (مثل الساحر / ياش ، إلفيش / إلفش ، مايكل ماسينيس / أوه ، وأنا :-P). إذا كنت تريد القيام بالأشياء بطريقة غير مريبة ، فربما تحتاج إلى قشرة غير مريبة.

إذا كنت تفكر حقًا في كيفية تنفيذ && || على الأسماك وجعل ذلك غير مريب جدًا ، فقد ترى أنك تقوم فقط بطرد begin; end (انظر ما يفعله الالتزام 594b460ba2d8dca59a3bfd282397c5f33aa9da6f ،العداد- ; and or لعب أدوار مزدوجة ،جدا قبيح إلى حد ما) واحصل على القليل من السكر.

pickfire هل يمكنك توضيح "نص السمك بطيء؟" هل هناك أي اختبارات تقودك إلى هذا الاستنتاج؟

FWIW في اختباراتي ، الأسماك أسرع من bash بشكل عام ، بحكم posix_spawn ومحللها السريع ، على الرغم من أنها قد تكون أبطأ في بعض الحالات مثل alias .

ivan<strong i="5">@alarmpi</strong> /tmp> echo 'echo test' > script
ivan<strong i="6">@alarmpi</strong> /tmp> time bash script
test
0.02user 0.01system 0:00.03elapsed 96%CPU (0avgtext+0avgdata 2776maxresident)k
0inputs+0outputs (0major+149minor)pagefaults 0swaps
ivan<strong i="7">@alarmpi</strong> /tmp> time mksh script
test
0.00user 0.00system 0:00.02elapsed 0%CPU (0avgtext+0avgdata 1420maxresident)k
480inputs+0outputs (2major+82minor)pagefaults 0swaps
ivan<strong i="8">@alarmpi</strong> /tmp> time fish script
test
0.07user 0.01system 0:00.09elapsed 85%CPU (0avgtext+0avgdata 4204maxresident)k
352inputs+0outputs (2major+231minor)pagefaults 0swaps

ridiculousfish تخيل فقط أنه بطيء جدًا مقارنة بالآخرين مقابل echo .

@ krader1961ridiculousfish IMO، مرة واحدة https://github.com/fish-shell/fish-shell/issues/2210 يحصل صدر هذا يمكن أن تكون مغلقة. هناك حل سهل للغاية نشره kballard .

pickfire شكرا لتقاسم ذلك. هذا الاختبار يقيس عبء بدء التشغيل ، وليس وقت echo . يعد وقت بدء التشغيل مهمًا للغاية ، ولكن لا يمكنك استخلاص النتائج بعد وقت بدء التشغيل (والذي يعتمد في الغالب على config.fish) من هذا الاختبار.

فيما يلي معيار صغير مختلف:

> cat test.fish
for i in (seq 1000)
    ls > /dev/null
end

> time fish test.fish
        1.51 real         0.74 user         0.65 sys

> cat test.sh
for i in {1..1000} ; do
    ls > /dev/null
done

> time bash test.sh
        2.01 real         0.85 user         1.12 sys

هنا تفوز الأسماك كثيرًا ، ولكن هذا بشكل أساسي يقيس الفرق بين fork vs posix_spawn.

أعتقد أن أحد الاستنتاجات هنا هو أننا بحاجة إلى مجموعة معايير شاملة.

ridiculousfish ها هو المعيار الذي أعطيته لي:

> cat test.fish
for i in (seq 1000)
    ls > /dev/null
end
> time fish test.fish
4.18user 4.04system 0:22.62elapsed 36%CPU (0avgtext+0avgdata 4360maxresident)k
96inputs+0outputs (1major+321041minor)pagefaults 0swaps
> cat test.sh
for i in {1..1000} ; do
    ls > /dev/null
done
> time bash test.sh
0.70user 1.62system 0:09.81elapsed 23%CPU (0avgtext+0avgdata 2844maxresident)k
0inputs+0outputs (0major+154100minor)pagefaults 0swaps
> time mksh test.sh
0.00user 0.01system 0:00.04elapsed 24%CPU (0avgtext+0avgdata 1780maxresident)k
752inputs+0outputs (3major+203minor)pagefaults 0swaps

يبدو أن mksh يتمتع بسرعة مذهلة.

pickfire fish's ls هي وظيفة في Linux تقوم ببعض الأشياء الأخرى لجعل الإخراج أجمل ، وهو ما لا تقوم به bash. إذا كنت تريد مقارنة التفاح إلى التفاح على Linux ، فاستخدم command ls . (في داروين ، غلاف السمك ls هو أرق بكثير - كان يجب أن أوضح ذلك لكني نسيت.)

تفسير "السرعة المثيرة للإعجاب" لـ mksh في اختبارك هو أن mksh لا يحتوي على توسيع دعامة ، لذلك فهو يستدعي ls مرة واحدة فقط. من الواضح أن استدعاء ls مرة واحدة أسرع بكثير من استدعاءه 1000 مرة.

يوضح هذا أن قياس الأداء صعب للغاية - من السهل جدًا قياس شيء مختلف عما تعتقد أنك تقيسه!

ridiculousfish ، هل هناك أي سبب لاستخدام الوظيفة ls هي مقارنة البرنامج النصي للأسماك بـ command ls ؟ الإخراج ليس مهمًا أثناء البرمجة النصية.

حسنًا ، هذه المرة فعلت ما قلته:

> cat test.fish
for i in (seq 1000)
    command ls > /dev/null
end
> time fish test.fish
0.66user 1.04system 0:08.08elapsed 21%CPU (0avgtext+0avgdata 4364maxresident)k
624inputs+0outputs (4major+113176minor)pagefaults 0swaps
> cat test.sh
for i in $(seq 1000) ; do
    ls > /dev/null
done
> time mksh test.sh
0.21user 0.65system 0:07.64elapsed 11%CPU (0avgtext+0avgdata 1884maxresident)k
0inputs+0outputs (0major+119632minor)pagefaults 0swaps
> time bash test.sh
0.15user 1.04system 0:08.66elapsed 13%CPU (0avgtext+0avgdata 2816maxresident)k
0inputs+0outputs (0major+150700minor)pagefaults 0swaps

في النهاية ، لا يزال mksh هو الأسرع ، والآن أجد أنه من الرائع أن يكون fish أسرع من mksh . إذا كان fish يحتوي على دعم تنفيذ أوامر متوازي مدمج ، أعتقد أنه كان سيكون الأسرع على الإطلاق.

إن وقت المستخدم هذا .66 مرتفع جدًا. أظن أنه بسبب محتويات config.fish الخاصة بك - تحديد الأسماء المستعارة وما إلى ذلك. للتسجيل ، هذا ما أراه في صندوق Linux الخاص بي (الأفضل من 3 لكل منها):

> time fish test.fish
0.15user 1.21system 0:01.33elapsed...
> time mksh test.mksh
0.12user 1.13system 0:01.24elapsed...
> time bash test.sh
0.18user 1.34system 0:01.47elapsed...

الجميع قريبون جدا.

قد يكون من المثير للاهتمام بالنسبة لأي معيار مرجعي أن يدمج نوعًا من "الصدفة Oracular" التي تؤدي فقط fork / exec أو posix_spawn لبعض أوامر المسار ، حتى نتمكن من التعرف على مدى بُعدنا عن السرعة القصوى التي يمكن أن يوفرها نظام التشغيل .

ridiculousfish ،

# Solarized colors
test $SHLVL = 2
and sh $HOME/.config/base16-shell/base16-solarized.dark.sh &
set fisher_home ~/.local/share/fisherman
set fisher_config ~/.config/fisherman
source $fisher_home/config.fish

حسنًا لأنه ربما يستخدم fisherman ، لست متأكدًا مما إذا كان سيؤدي إلى إبطائه. bucaran هو الرجل اللطيف لهذا. هذه المرة ، أفرغت config.fish (أفضل نتيجة لـ 5 محاولات):

> time fish test.fish; time mksh test.sh; time bash test.sh
0.62user 1.09system 0:07.28elapsed 23%CPU (0avgtext+0avgdata 4396maxresident)k
0inputs+0outputs (0major+108240minor)pagefaults 0swaps
0.21user 0.62system 0:06.92elapsed 11%CPU (0avgtext+0avgdata 1888maxresident)k
0inputs+0outputs (0major+116674minor)pagefaults 0swaps
0.29user 0.81system 0:07.78elapsed 14%CPU (0avgtext+0avgdata 2780maxresident)k
0inputs+0outputs (0major+145628minor)pagefaults 0swaps

pickfireridiculousfish يمكنك الدردشة في قضية أخرى حتى أتمكن من منع رسائلك؟

نعم ، آسف لإرسال بريد عشوائي لهذه المشكلة. pickfire إذا كنت ترغب في متابعة بعض المعايير التي تعتقد أنها مثيرة للاهتمام أو ذات صلة بشكل خاص ، فلا تتردد في فتح مشكلة أخرى.

حول توافق bash و zsh ، أنا شخصياً لا أتوقع التوافق الكامل ، ولكن مع كل جزء من التوافق يمكن أن تصبح الأسماك المضافة أكثر شيوعًا.
حتى بدون أخذ البرمجة النصية في الاعتبار ، فإن && و || مهمان لأنهما شائعان جدًا لتسلسل الأوامر. كمثال ما زلت أواجه مشاكل مع # 2292. أعلم أنه يمكن اعتباره ليس خطأ سمكي ، لكن الحقيقة هي أن تحسين توافق الأسماك من شأنه إصلاحه.

أنا مع maxfl هنا ،: -1: لوجود || و && كجزء من بناء جملة الأسماك ، إذا كان من المفترض أن يكون تصويتًا شائعًا.

السمك ليس باش (أو زش). لا يوجد سبب مقنع لتطبيق && و || بخلاف التوافق مع تلك القذائف. التوافق مع الوضع الراهن هو هدف مضاد لهذا المشروع.

Nodd : إن

بالنسبة لجميع الأشخاص الذين يبحثون عن حل ، نظرًا لأن الأسماك 2.3 يمكنني أن أؤكد أنه يوجد حل عملي بالكامل في النهاية.

فقط افعل ما ورد في الإجابة أعلاه:

ها أنت ذا. بمجرد وصول PR # 1633 إلى الأرض ، يمكنك أن تأخذ ما يلي وحفظه في ~ / .config / fish / function / fish_user_key_bindings.fish:

function handle_input_bash_conditional --description 'Function used for binding to replace && and ||'
    # This function is expected to be called with a single argument of either & or |
    # The argument indicates which key was pressed to invoke this function
    if begin; commandline --search-mode; or commandline --paging-mode; end
        # search or paging mode; use normal behavior
        commandline -i $argv[1]
        return
    end
    # is our cursor positioned after a '&'/'|'?
    switch (commandline -c)[-1]
    case \*$argv[1]
        # experimentally, `commandline -t` only prints string-type tokens,
        # so it prints nothing for the background operator. We need -c as well
        # so if the cursor is after & in `&wat` it doesn't print "wat".
        if test -z (commandline -c -t)[-1]
            # Ideally we'd just emit a backspace and then insert the text
            # but injected readline functions run after any commandline modifications.
            # So instead we have to build the new commandline
            #
            # NB: We could really use some string manipulation operators and some basic math support.
            # The `math` function is actually a wrawpper around `bc` which is kind of terrible.
            # Instead we're going to use `expr`, which is a bit lighter-weight.

            # get the cursor position
            set -l count (commandline -C)
            # calculate count-1 and count+1 to give to `cut`
            set -l prefix (expr $count - 1)
            set -l suffix (expr $count + 1)
            # cut doesn't like 1-0 so we need to special-case that
            set -l cutlist 1-$prefix,$suffix-
            if test "$prefix" = 0
                set cutlist $suffix-
            end
            commandline (commandline | cut -c $cutlist)
            commandline -C $prefix
            if test $argv[1] = '&'
                commandline -i '; and '
            else
                commandline -i '; or '
            end
            return
        end
    end
    # no special behavior, insert the character
    commandline -i $argv[1]
end

function fish_user_key_bindings
    bind \& 'handle_input_bash_conditional \&'
    bind \| 'handle_input_bash_conditional \|'
end

تضمين التغريدة

ماذا عن عادل؟

function sudo_bang_bang --on-event fish_postexec
    abbr !! sudo $argv[1]
end

brj أيضًا وضع ذلك في ~/.config/fish/functions/fish_user_key_bindings.fish ؟ لا يبدو أن هذا يفي بالغرض بالنسبة لي.

تحتاج إلى مصدر هذه الوظيفة. لذا ، فإن خياراتك هي وضعه في config.fish الخاص بك أو وضعه داخل ~ / .conf.d / [name-dont-matter] .fish.

brj : مشكلة خاطئة لهذه الوظيفة. هذا عن "&&" و "||" ، وليس "!!" - أشياء مختلفة.

faho لول ، أنت على حق. أتلقى دائمًا إشعارًا من هذه المشكلة ، لذلك اعتقدت أن هذه حالة أخرى من sudo !!.

Globegitter آسف للارتباك!

ماذا عن شحن الحل البديل المقترح باستخدام الأسماك كمثال ، حتى يتمكن المستخدمون من نسخه بسهولة؟ يمكن بسهولة زيادة رسالة الخطأ لذكر ذلك. أستمر في لصق نفس البطانة (من مراجعة كود gerrit) حيث يتم استخدام && لأنه يعمل في جميع الأصداف تقريبًا (بما في ذلك windows cmd.exe إلى جانب قذائف unix-y). بالنسبة لي ، البرنامج النصي المذكور أعلاه هو معزز للإنتاجية (كنت أكتب bash -c "لصق هنا" لفترة من الوقت ...).

كيف أفعل &&؟ هل هناك قرار؟

نفس المشكلة المذكورة أعلاه ، لا أجد أي طريقة للقيام بها

gcc test2.c -o a.out && ./a.out

في السمك.

gcc test2.c -o a.out; and ./a.out

ivan حاول ذلك ، لكنه يعطي "and" و ". / a.out" حججًا إلى دول مجلس التعاون الخليجي.

// تحرير: بالمناسبة ، انتهى بي الأمر باستخدام برنامج bash النصي ، لأن هذا يبدو مستحيلًا تمامًا في الأسماك :(

gcc test2.c -lwlc -o a.out && (( sleep 2s; DISPLAY=:2 xterm ) & ./a.out)

أفعل هذا الشيء "المستحيل تمامًا" كثيرًا. ربما جرب بناء الجملة ; and في بيئة سمكية نظيفة؟ إذا لم ينجح الأمر ، فربما يكون هناك شيء ما مع الفاصلة المنقوطة؟ هل تكتب هذا في الأسماك ، أم أنه يتم تمريره من برنامج آخر؟

ivan الكتابة.

آسف على سؤال ربما يكون غبيًا ، لكن كيف أفعل الأقواس؟ لا يمكنني العثور على كلمة واحدة عنها في الوثائق وهي ليست موضوعًا قابلًا للتطبيق في googlable بالضبط :(

gcc test2.c -lwlc -o a.out && ((sleep 2s؛ DISPLAY =: 2 xterm) & ./a.out)

kozec أعتقد أنك تواجه مشكلة في تجميع العناصر معًا هنا. ما تحتاج إلى استخدامه هو begin مثل القوس الأيسر (هذا ما أفكر به) و end مثل القوس الصحيح.

gcc test2.c -lwlc -o a.out; and begin sleep 2s; env DISPLAY=:2 xterm; end & ./a.out

أو مسافة بادئة:

      gcc test2.c -lwlc -o a.out
         and begin sleep 2s
             env DISPLAY=:2 xterm
         end & ./a.out

floam شكرا ، هذا تقريبا يعمل. لكن الأشياء قبل & لا يتم إرسالها إلى الخلفية :(

مثال بسيط:

begin sleep 2s ; env DISPLAY=:2 xterm ; end & Xephyr :2

ينام 2s ، ثم يبدأ xterm ، _ ثم يبدأ XServer لذلك xterm. تعطل xterm ofc قبل أن يصبح XServer جاهزًا.

ستجد أنه يمكنك التغلب على هذا الأمر حيث يجب عليك ، ألا تكون جميلًا:

fish -c 'sleep 2s; env DISPLAY=:2 xterm' & Xephyr :2

عندما يكون لديك عدد كبير من البرامج النصية الموجودة ، من أجل التطوير والبناء وداخل البرامج النصية npm run-scripts ، فمن غير المعقول التبديل ، خاصة وأن بعضها / معظمها ليس على الأسماك. بالنسبة لنصوص bash العادية مع shebang وكلها ليست مشكلة بالطبع.

الشيء الجميل (أو "اللطيف") في && هو أنه يعمل على الأصداف العادية ليس فقط على أنظمة Linux و Mac ولكن أيضًا على Windows وهو أمر جيد للإعداد السريع لبيئات التطوير وما إلى ذلك.

ليس كسر صفقة بأي وسيلة ، ولكن نوعًا من الصعب معرفة سبب إضافتها أيضًا؟

حسنًا ، هذه حجة سخيفة إلى حد ما. لماذا لا توجد "أوضاع" مختلفة لمترجم الأسماك؟ أي ، نوع من الإعدادات التي يمكنك تمكينها حيث يمكنك الحصول على أشياء سمكية "نقية" أو يمكنك التوافق مع أصداف تشبه bash جنبًا إلى جنب مع fish-isms. يمكنك أيضًا الحصول على "مستويات" مختلفة من التوافق مع الأصداف الأخرى بحيث يمكنك الحصول على توافق كامل أو عدم توافق أو شيء بينهما. أعني ، على المستوى الأساسي ، يمكنك على الأقل تنفيذ نوع من مترجم المصدر إلى المصدر لهذا الغرض. أو خذ كود bash وقم بترجمته إلى تمثيل داخلي متوسط ​​للأسماك. يمكنك القيام بكل أنواع الأشياء للترجمة في هذا الصدد. صححني إذا كنت مخطئًا ، لكنني أعتقد أن مفاهيم مستوى اللغة في باش وآخرون. مقابل الأسماك ليست مختلفة تمامًا ، أليس كذلك؟

على أي حال ، هذا هو مبلغ 0.02 دولار الخاص بي بشأن هذه المشكلة والذي يبدو سخيفًا حقًا لأنه مبني على فرضية:

"pure fish"
XOR
"compatibility with bash / becoming another bash clone"

عندما لا يوجد شيء يمنع وجود أرضية وسط بين هذين المفهومين.

يجب على المرء على الأقل أن يواجه حقيقة أن الأصداف الشبيهة بالباش هي معيار وشعبية أكثر بكثير من الأصداف الباطنية مثل الأسماك ، لذلك يجب أن يكون هناك نوع من طبقة التوافق لأي فرصة واقعية لأن تصبح الأسماك صدفة قادرة على الوقوف على إصبع القدم -إلى أخمص القدمين مع باش من حيث انتشارها وعدم التسبب في صداع التوافق.

... عندما لا يوجد شيء يمنع وجود أرضية وسط بين هذين المفهومين.

لا شيء غير شخص (أو مجموعة من الأشخاص) يستثمر أكثر من 2000 ساعة (شخص في السنة) لكتابة الكود الضروري. إنني أتطلع إلى مراجعة طلبات السحب منك ، ylluminarious ، لتنفيذ كل ذلك. ما تقترحه يعادل السؤال عن سبب عدم تمكن شخص ما من جعل بايثون يفسر لغة PHP أيضًا. الجواب هو أنه من الناحية النظرية يمكن أن يكون لديك مفتاح توافق للقيام بذلك ولكن لماذا تفعل ذلك؟

نفذ في # 4620.

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

القضايا ذات الصلة

Limeth picture Limeth  ·  3تعليقات

spacekookie picture spacekookie  ·  3تعليقات

andrewhowdencom picture andrewhowdencom  ·  3تعليقات

luc-j-bourhis picture luc-j-bourhis  ·  3تعليقات

olivergondza picture olivergondza  ·  3تعليقات