سؤال أيهما أفضل: استخدام ؛ أو && لتنفيذ أوامر متعددة في سطر واحد؟


في البرامج التعليمية والكيفية التي غالبا ما أرى الأوامر مجتمعة. على سبيل المثال،

sudo apt-get update && sudo apt-get install pyrenamer

يبدو أن هناك أربعة موصلات محتملة: &، &&، || و ;. رغم ذلك &  موصل واضح لي (يرسل عملية إلى الخلفية ويترك المحطة المتاحة) ، ليس من الواضح ما الفرق بين && و ;. وأنا لم أكن أعرف من || حتى تعليق كايا.

الأسئلة التالية تتعامل مع الفرق بين الوصلَين ، ولكن في الغالب في التعليقات:

إذن ، إليك عددًا من الأسئلة ذات الصلة:

  1. ماهو الفرق بين ; و &&؟
  2. متى يجب عليك استخدامها على التوالي؟ سيكون من اللطيف رؤية بعض حالات الاستخدام: إذا كنت أرغب في تشغيل أمر ثم بعد إيقاف تشغيل الكمبيوتر ، فماذا يجب أن أختار الموصل؟
  3. ما هم مزايا و مخاطر؟ روبي باسك يذكر في تعليق ل هذا الجواب هذا الأمر مثل cd /somewhere_else; rm -Rf * يمكن أن يكون لها عواقب مدمرة إذا فشل العنصر الأول في سلسلة الأوامر ، على سبيل المثال.
  4. إذا كانت ذات صلة ، من أين أتت؟

332
2017-08-20 16:41


الأصل


يوجد موصل آخر ربما لم تصادفه: ||بالضبط مثل && باستثناء أنه ينفذ الأمر الثاني فقط في حالة الخروج الأول من حالة غير صفرية (غير ناجحة). - Kaya
لاحظ أيضًا أن تشغيل البرنامج النصي مع set -e سيوقف البرنامج النصي عن الفشل كما لو كانت جميع الأوامر متصلة &&. - choroba
stackoverflow.com/questions/3573742/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
لا أحد يجيب Qn 4 ... أظن سلوك && و || مستوحاة من لغة البرمجة C. في حالة (x && y) ، إذا تم تقييم x إلى false ، يجب أن يكون التعبير بالكامل خاطئًا حتى يتمكن المترجم من تحسين تقييم y ، في حال كان مكلفًا. معايير C و C ++ الحديثة في الواقع تطلب هذا التحسين ، بحيث يمكن للبرامج أن تفترض بأمان أنه لن يتم تقييم y إذا كانت x خاطئة. على سبيل المثال ، لن تتعطل (ptr && ptr-> days> 31) حتى إذا كانت ptr خالية. أيضا في C ، تنتهي البيانات مع ؛ بغض النظر عما إذا كان هناك بيان آخر على نفس السطر أم لا. - Kevin


الأجوبة:


Cheatsheet:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

608
2017-10-20 11:02



وبالطبع، A & B &: تشغيل A في الخلفية ، ثم تشغيل B في الخلفية (بغض النظر عن النجاح) وإرجاع التحكم إلى shell. هذا غالبا ما يعمل عن نفسه مثل تشغيل كلتا العمليتين في نفس الوقت. - Limited Atonement
هل من الممكن أن نقول: تشغيل في الخلفية ، تليها ب في الخلفية إلا إذا عملت؟ ( أظن &&& ؟) - user230910
@ user230910: من شأنه أن يكون (A && B) &. - leftaroundabout
يمكنك الإشارة وثيقة موثوق لهذا؟ - Jaime Hablutzel
Jack عندما أعدم من Cronjob ، فإنه لا يتبع هذه القاعدة ، أي فكرة لماذا؟ لملف الثعبان - CodeGuru


&& فقط تشغيل الأمر الثاني إذا كان أول واحد يخرج مع حالة 0 (كان ناجحا). ; يدير كل من الأوامر ، حتى لو كان الأول يخرج مع حالة غير صفرية.

المثال الخاص بك مع && يمكن أن يعاد صوغه بشكل مماثل

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

77
2017-08-20 16:46



شكر. لقد قمت بتحديث السؤال للتأكد من أن الفروع المختلفة يمكن تمييزها بسهولة. - don.joey
@ خاص: يجب عليك استخدام ; إذا لم يحتاج الأمر الثاني إلى النجاح السابق. - choroba


عن طريق ; سيقوم بتنفيذ الأوامر بغض النظر عن نجاح الأمر الأول أم لا.

استخدام && تنفيذ الأمر الثاني فقط عند تنفيذ الأمر الأول بنجاح (الحالة 0).

كلاهما يستخدم في منظور مختلف. مثل لعملية أطول ، لنفترض التثبيت لتركيبه وتثبيته. يجب make && make install. لذلك سيتم تشغيل التثبيت فقط إذا make ناجحة.

لذلك بالنسبة للأوامر التابعة يجب عليك استخدامها &&

استخدم bash wring أو الأوامر ذات الأوامر المستقلة ; 

حتى إذا كنت ترغب في إيقاف تشغيل الكمبيوتر حتى فشل استخدام أول وظيفة ; ، ولكن إذا كنت تريد على النجاح الكامل للوظيفة الأولى الشروع في استخدام الاغلاق &&


28
2017-08-20 16:50



شكر. أنا أحب حالة الاستخدام الأخيرة التي تقدمها. لقد قمت بتحديث السؤال. - don.joey


a ; b سيتم تشغيل b بغض النظر عن حالة الخروج من. a && b سيتم تشغيل b فقط إذا نجح.

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

اما السؤال الرابع: انهم بناء جملة باش.

لا يوجد خطر حقيقي في استخدام إما. مرة أخرى ، التعريف أعلاه كافي. هذا يعني أنك سوف تكتب && متى b لديه آثار غير مقصودة إذا a لا تنجح. ليست هناك حاجة لمزيد من القواعد أو تفسير ، IMHO.


13
2017-08-20 21:05