IF स्टेटमेंट का उपयोग करते समय मैं कई लाइनों पर शेल कमांड को कैसे विभाजित कर सकता हूं?


384

जब मैं कमांड एक ifस्टेटमेंट का हिस्सा होता है, तो मैं शेल में कई लाइनों पर कमांड कैसे विभाजित कर सकता हूं ?

यह काम:

if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1                                                                       
fi

यह काम नहीं करता है:

# does not work:
if ! fab --fabfile=.deploy/fabfile.py \ 
  --forward-agent \
  --disable-known-hosts deploy:$target; then   
  rc=1
fi

पूरे कमांड को निष्पादित करने के बजाय, मुझे मिलता है:

./script.sh: line 73: --forward-agent: command not found

इससे भी महत्वपूर्ण बात, बाश की मेरी समझ से क्या गायब है जो मुझे भविष्य में इस और इसी तरह के मुद्दों को समझने में मदद करेगा?


2
त्रुटि क्या है? मैं $ if ! cp -n log/server1.log \ > .; then echo no copy; fiत्रुटि के बिना निष्पादित करने में सक्षम हूं , इसके बाद एक नई रेखा के साथ\
दु: खद परिवर्तनीय

15
क्या आपके पास टर्मिनल बैकस्लैश के बाद रिक्त स्थान है \ ? वे देखने के लिए बहुत कठिन हैं। यदि आप करते हैं, तो आप यह देखना चाहते हैं कि क्या आप अपने संपादक को या तो अनुगामी रिक्त स्थान हटा सकते हैं या उन्हें अधिक दृश्यमान बना सकते हैं।
msw

10
हां, यह टर्मिनल बैकस्लैश के बाद रिक्त स्थान था। पूरी तरह से। धन्यवाद।
दिमित्री मिनकोवस्की

और हाँ, क्षमा करें, मुझे "त्रुटि" (अप्रत्याशित परिणाम) पोस्ट करना चाहिए था! मेरी गलती! अब संपादन कर रहे हैं।
दिमित्री मिंकोवस्की

आपकी समझ क्या थी? यह सवाल का हिस्सा नहीं है और न ही।
हक्रे

जवाबों:


566

यदि आपके पास व्हाट्सएप (रिक्त स्थान या टैब वर्ण) बैकस्लैश के बाद और न्यूलाइन से पहले लाइन-कंटीन्यूशन विफल हो जाएगा। इस तरह के किसी व्हाट्सएप के साथ, आपका उदाहरण मेरे लिए ठीक नहीं है:

$ cat test.sh
if ! fab --fabfile=.deploy/fabfile.py \
   --forward-agent \
   --disable-known-hosts deploy:$target; then
     echo failed
else
     echo succeeded
fi

$ alias fab=true; . ./test.sh
succeeded
$ alias fab=false; . ./test.sh
failed

टिप्पणियों से प्रचारित कुछ विवरण: शेल में लाइन-निरंतरता बैकस्लैश वास्तव में एक विशेष मामला नहीं है; यह सामान्य नियम का एक उदाहरण है कि एक बैकस्लैश "तुरंत" चरित्र का उद्धरण करता है, किसी भी विशेष उपचार को रोकता है जो सामान्य रूप से इसके अधीन होगा। इस मामले में, अगला चरित्र एक नई रूपरेखा है, और विशेष उपचार को रोका जा रहा है जो कमांड को समाप्त कर रहा है। आम तौर पर, एक उद्धृत चरित्र हवाओं को कमांड में शाब्दिक रूप से शामिल किया जाता है; बैकस्लेस्ड न्यूलाइन को इसके बजाय पूरी तरह से हटा दिया गया है। लेकिन अन्यथा, तंत्र समान है। और बैकस्लैश केवल तुरंत-निम्नलिखित चरित्र को उद्धृत करता है; यदि वह वर्ण एक स्थान या टैब है, तो आपको केवल एक उद्धृत स्थान या टैब मिलता है, और बाद की कोई भी नई पंक्ति निर्विवाद रहती है।


5
मार्क, तुम्हें पता है, मेरे पास व्हाट्सएप होना चाहिए था। मैं `s. For example, when adding one after the first `के बाद व्हॉट्सएप को जोड़ने पर केवल त्रुटि को पुन: उत्पन्न करने में सक्षम हूं ./soundops: line 73: --forward-agent: command not found। मेरा मुद्दा यह था कि मुझे यह त्रुटि समझ में नहीं आई। उस त्रुटि में व्हाट्सएप का परिणाम क्यों होता है? \nव्हॉट्सएप + "` को "और" एक कमांड का परिसीमन करता है?
दिमित्री मिनकोवस्की

83
न्यूलाइन के सामने बैकस्लैश कमांड को समाप्त करने से न्यूलाइन को रोकता है। लेकिन बस के रूप में विशेष एस्केप अनुक्रम "\ n" केवल बैकस्लैश और एन के बीच कुछ भी नहीं के साथ काम करते हैं, बैकस्लैश-न्यूलाइन केवल बैकस्लैश और न्यूलाइन के बीच कुछ भी नहीं के साथ काम करता है।
मार्क रीड

18
Hahaha वाह, निश्चित रूप से समझ में आता है। इसे कभी इस तरह से नहीं देखा। आंख खोलना, फिर भी इतना सरल: यह सिर्फ एक बची हुई नई रेखा है। मुझे अदृश्य पात्रों से नफरत है। अगर वे सब सिर्फ दिखाई दे रहे थे, तो वे मेरे लिए इतना अधिक समझ में आता है। धन्यवाद!
दिमित्री मिनकोवस्की

7
अधिकांश संपादकों में आप उन अदृश्य पात्रों को देख सकते हैं।
लूसैसिव

1
बैकस्लैश और न्यूलाइन को प्रभावी कमांड लाइन से हटा दिया जाता है, लेकिन अगली लाइन पर किसी भी प्रमुख व्हाट्सएप को संरक्षित किया जाता है। तो यह समस्या है या नहीं, इस पर निर्भर करता है कि व्हाट्सएप सिंगल-लाइन कमांड में उस बिंदु पर समस्या होगी या नहीं।
मार्क रीड ने

52

Windows / WSL / Cygwin आदि उपयोगकर्ताओं के लिए:

सुनिश्चित करें कि आपकी लाइन एंडिंग मानक यूनिक्स लाइन फीड्स हैं, अर्थात \n(LF) केवल।

विंडोज लाइन एंडिंग \r\n(CRLF) लाइन एंडिंग्स का उपयोग करने से कमांड लाइन ब्रेक टूट जाएगा।


ऐसा इसलिए है क्योंकि \विंडोज लाइन के साथ एक लाइन के अंत में अनुवाद समाप्त होता है \ \r \n
जैसा कि ऊपर मार्क ठीक से बताता है:

यदि आप बैकस्लैश के बाद और न्यूलाइन से पहले व्हाट्सएप करते हैं तो लाइन-कंटीन्यूशन विफल हो जाएगा।

इसमें न केवल स्थान ( ) या टैब ( \t) बल्कि गाड़ी की वापसी ( \r) भी शामिल है।


1
Windows में स्क्रिप्ट बनाते समय और उसके बाद Windows bash (उदाहरण bash -c MyShellScript.sh जहां MyShellScript.sh विंडोज एडिटर में बनाया गया था) का उपयोग करते हुए बनाई गई समस्या को ठीक करता है। आपको MyPhellScript.sh को UNIX प्रारूप में शायद नोटपैड ++ का उपयोग करके सहेजना होगा।
बसलिता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.