it-swarm.asia

ما هو الغرض من "&&" في أمر Shell؟

بقدر ما أعرف ، فإن استخدام & بعد الأمر هو لتشغيله في الخلفية.

مثال على & الاستخدام: tar -czf file.tar.gz dirname &

ولكن ماذا عن &&؟ (انظر إلى هذا المثال: https://serverfault.com/questions/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188 )

306
Captain

يتيح لك && القيام بشيء بناءً على ما إذا كان الأمر السابق قد تم إكماله بنجاح - ولهذا السبب تميل إلى رؤيته بالسلاسل كـ do_something && do_something_else_that_depended_on_something.

350
girasquid

علاوة على ذلك ، لديك أيضًا || وهو المنطقي أو ; وهو مجرد فاصل لا يهتم بما حدث للأمر من قبل.

$ false || echo "Oops, fail"
Oops, fail

$ true || echo "Will not be printed"
$  

$ true && echo "Things went well"
Things went well

$ false && echo "Will not be printed"
$

$ false ; echo "This will always run"
This will always run

يمكن العثور على بعض التفاصيل حول هذا هنا قوائم الأوامر في دليل Bash.

325
plundra

سطر الأوامر - ما هو الغرض من &&؟

في شل ، عندما ترى

$ command one && command two

القصد من ذلك هو تنفيذ الأمر الذي يتبع && فقط في حالة نجاح الأمر الأول. هذا هو اصطلاحي من قذائف Posix ، وليس فقط وجدت في باش.

انها تعتزم منع تشغيل العملية الثانية إذا فشلت الأولى.

تقوم العمليات بإرجاع 0 للأرقام الصحيحة والأرقام الموجبة الأخرى للخطأ

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

يشار إلى && باسم AND_IF في (posix Shell grammar ، التي تعد جزءًا من and_or list من الأوامر ، والتي تتضمن أيضًا || والتي هي OR_IF مع دلالات مماثلة.

رموز القواعد:

%token  AND_IF    OR_IF    DSEMI
/*      '&&'      '||'     ';;'    */

قواعد:

and_or           :                         pipeline
                 | and_or AND_IF linebreak pipeline
                 | and_or OR_IF  linebreak pipeline

كلا المشغلين لهما أسبقية متساوية ويتم تقييمهما من اليسار إلى اليمين (يتم تركهما اقترانيين) على سبيل المثال ، ما يلي:

$ false && echo foo || echo bar
$ true || echo foo && echo bar

كلاهما صدى bar فقط.

  1. في الحالة الأولى ، الكاذبة هي أمر يخرج من حالة 1

    $ false
    $ echo $?
    1
    

    مما يعنيecho foo لا يعمل ((مثل ، shortcircuiting echo foo). ثم يتم تنفيذ الأمر echo bar.

  2. في الحالة الثانية ، يتم إنهاء true برمز 0

    $ true
    $ echo $?
    0
    

    وبالتالي لم يتم تنفيذ echo foo ، ثم echo bar تم تنفيذه.

89
Aaron Hall

الاستخدام الشائع جدًا لـ '&&' هو تجميع البرامج باستخدام أدوات autotools. فمثلا:

./configure --prefix=/usr && make && Sudo make install

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

في بعض الأحيان أحصل على ...

tar xf package.tar.gz && ( cd package; ./configure && make && Sudo make install ) && rm package -rf

أفعل هذا عندما على سبيل المثال جعل لينكس من مربع الصفر.

30
Nigel Atkinson

&& سلاسل الأوامر معا. يتم تنفيذ الأوامر المتعاقبة فقط في حالة نجاح الأوامر السابقة.

وبالمثل ، سيسمح || بتنفيذ الأمر المتتالي في حالة فشل السابق.

انظر باش شل البرمجة .

17
Dean Burge

انظر المثال:

mkdir test && echo "Something" > test/file

سيحاول Shell إنشاء دليل test ثم ، فقط إذا كان ناجحًا سيحاول إنشاء ملف بداخله.

لذلك قد تقاطع سلسلة من الخطوات إذا فشل أحدها.

8
alno

command_1 && command_2: تنفيذ command_2 فقط عندما يتم تنفيذ command_1 بنجاح.

command_1 || command_2: تنفيذ command_2 فقط عندما لا يتم تنفيذ command_1 بنجاح.

يبدو مشابهًا لكيفية تنفيذ شرط "if" بلغة برمجة سائدة ، على سبيل المثال ، في if (condition_1 && condition_2){...}_ شرط _ سيتم حذف إذا كان condition_1 false وفي if (condition_1 || condition_2){...}_ شرط _2 إذا تم حذف condition_1 true. انظر ، إنها نفس الخدعة التي تستخدمها في الترميز :)

6
Xiaonin Li

إنه تنفيذ عبارة ثانية إذا انتهى البيان الأول بنجاح. مثل بيان if:

 if (1 == 1 && 2 == 2)
  echo "test;"

يحاول الأول إذا 1 == 1 ، إذا كان هذا صحيحًا يتحقق إذا 2 == 2

5
Nick