क्या दो एम्परसेंड और एक अर्ध-बृहदान्त्र बैश में संचालित होता है?


71

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

cd /home; ls -al

या यह:

cd /home && ls -al

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

जवाबों:


88

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

cd /home; ls -al

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

cd /home && ls -al

यह केवल चलेंगे ls -alअगर cd /homeसफल रहा था।


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

70
a && b

यदि कोई शून्य निकास कोड देता है, तो b को निष्पादित किया जाता है।

a || b

यदि कोई गैर-शून्य निकास कोड लौटाता है, तो b को निष्पादित किया जाता है।

a ; b

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


16
cd /fakedir; ls -al

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

cd /fakedir && ls -al

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

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


4

if..then..elseकमांड लॉजिक का पीछा करने के लिए आप उन्हें एक साथ जोड़ सकते हैं ।

उदाहरण:

ls file.ext && echo "file exists" || echo "file does not exist"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.