सवाल क्या दो एम्पर्सेंड और सेमी-कोलन बैश में कैसे काम करते हैं, इसके बीच कोई अंतर है?


अगर मैं एक पंक्ति पर दो अलग-अलग आदेशों को चलाने के लिए चाहता था, तो मैं यह कर सकता था:

cd /home; ls -al

या यह:

cd /home && ls -al

और मुझे एक ही परिणाम मिलते हैं। हालांकि, इन दो तरीकों से पृष्ठभूमि में क्या चल रहा है? उनके बीच कार्यात्मक अंतर क्या है?


66
2018-03-24 20:51


मूल




जवाब:


; सिर्फ एक कमांड को दूसरे से अलग करता है। && अगर पिछले सफल हुआ तो केवल निम्न आदेश चलाएं

cd /home; ls -al

यह करेगा cd /home और यहां तक ​​कि अगर cd आदेश विफल रहता है (/home अस्तित्व में नहीं है, आपको इसे पार करने की अनुमति नहीं है, आदि), यह चल जाएगा ls -al

cd /home && ls -al

यह केवल चलाएगा ls -al अगर cd /home कामयाब रहा।


84
2018-03-24 20:58



का उपयोग ;  उदाहरण के लिए, वास्तव में एक खतरनाक (कम से कम आरएम कमांड के साथ) है cd /some/dir; rm -fr ./*। तो इस तरह के विनाशकारी ऑपरेशन के साथ आपको यह सुनिश्चित करना होगा कि आप आरएम निष्पादित करने से पहले सही जगह पर हैं। सही आदेश है cd /some/dir && rm -fr ./* - ALex_hha


a && b

अगर  फिर शून्य निकास कोड देता है  निष्पादित किया जाता है।

a || b

अगर  फिर गैर-शून्य निकास कोड देता है  निष्पादित किया जाता है।

a ; b

 निष्पादित और फिर किया जाता है  निष्पादित किया जाता है।


68
2018-03-26 01:50





cd /fakedir; ls -al

रन ls वर्तमान निर्देशिका में क्योंकि cd /fakedir असफल हो जाएगा और खोल बाहर निकलने वाली स्थिति को अनदेखा कर देगा जो शून्य नहीं है।

cd /fakedir && ls -al

क्यों कि && ऑपरेटर केवल तब जारी रहेगा जब पिछला कमांड सामान्य रूप से बाहर निकलता है (शून्य की स्थिति), नहीं ls ऑपरेशन किया जाएगा।

अन्य ऑपरेटर हैं, जैसे कि & जो एक प्रक्रिया पृष्ठभूमि होगा। जबकि अक्सर एक कमांड के अंत में रखा जाता है, इसे एक श्रृंखला के बीच में रखा जा सकता है।


15
2018-03-24 21:00





आप उन्हें एक साथ भी शामिल कर सकते हैं if..then..else चेन कमांड तर्क के लिए।

उदाहरण:

ls file.ext && echo "file exists" || echo "file does not exist"

3
2018-03-08 08:32