जब मैं एक एकल उद्धरण टाइप करता हूं तो टर्मिनल किस मोड में जाता है?


11

जब मैं 'टर्मिनल में एकल उद्धरण दर्ज करता हूं तो यह किसी अन्य मोड में चला जाता है, और कमांड निष्पादित नहीं करते हैं। यह मोड क्या है और हम इसका उपयोग कब करते हैं?

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#

30
और आप जड़ के रूप में क्यों चल रहे हैं?
ज़ना

13
आपका टर्मिनल पहले की तरह एक ही मोड में है - आपका शेल एक अलग मोड में है (दूसरे के साथ एक स्ट्रिंग के पूरा होने की प्रतीक्षा कर रहा है ')
ओनो

जवाबों:


26

प्रभावी रूप से, शेल एक पूर्ण कमांड / अभिव्यक्ति के लिए कहता है , और इस कारण से PS2शीघ्र स्ट्रिंग प्रदर्शित कर रहा है ।

से man bash:

उत्साह

अंतःक्रियात्मक रूप से निष्पादित करते समय, bash प्राथमिक प्रॉम्प्ट PS1 को प्रदर्शित करता है जब यह कमांड पढ़ने के लिए तैयार होता है, और सेकेंडरी प्रॉम्प्ट PS2 जब इसे कमांड पूरा करने के लिए अधिक इनपुट की आवश्यकता होती है।

और उससे थोड़ा पहले:

  PS2    The value of this parameter is  expanded
          as  with  PS1  and used as the secondary
          prompt string.  The default is ``> ''.

इस प्रकार, जैसा कि आप प्रलेखन को पढ़ने से अनुमान लगा सकते हैं, गोले के विभिन्न उद्देश्यों के साथ कई संकेत हैं। PS1शीघ्र अपनी है root@sai:~#स्ट्रिंग, जो आम तौर पर पता चलता है जब आप आदेशों को दर्ज करें। >है PS2शीघ्र। दूसरों को भी बताया गया है: PS3के लिए selectआदेश ब्लॉक और PS4साथ डीबगिंग के लिए set -xआदेश। इस मामले में हम अधिक रुचि रखते हैं PS2

ऐसे कई तरीके हैं, जिसमें शेल PS2प्रॉम्प्ट दिखा सकता है (और जहां एक नई लाइन पर कमांड को पूरा करना आवश्यक हो सकता है)। जब आप here-docपुनर्निर्देशन करते हैं (जहां एक कमांड को पूर्ण माना जाता है, जब आप इस स्ट्रिंग को देखते हैं, तो इसी उदाहरण का उपयोग किया जाता है, इस उदाहरण में EOF):

$ cat <<EOF
> line one
> line two
> EOF
line one
line two

बहुत बार एक लंबी कमांड को जारी रखने को जोड़कर \और तत्काल (!) न्यूलाइन द्वारा किया जा सकता है , जो दिखाई देने के लिए समान संकेत देगा:

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World

जब नई लाइन से पहले पाइप, लॉजिक ऑपरेटर, या विशेष कीवर्ड कमांड-लाइन पर दिखाई देते हैं, तो कमांड को भी अधूरा माना जाता है जब तक कि सभी अंतिम विवरण नहीं जुड़ जाते हैं:

$ echo Hello World | 
> wc -l
1

$ echo Hello World &&                                                                                                    
> echo "!"
Hello World
!

$ for i in $(seq 1 3); do
> echo "$i"
> done
1
2
3 

$ if [ -f /etc/passwd ]
> then
>     echo "YES"
> fi
YES

आपके विशेष मामले में, एक एकल उद्धरण का अर्थ है एकल उद्धरणों के बीच की शाब्दिक व्याख्या। इस प्रकार, जैसा कि ज़ाना ने बताया, आप एक कमांड दर्ज कर रहे हैं जिसमें न्यूलाइन + ls+ न्यूलाइन शामिल हैं। ऐसा निष्पादन योग्य फ़ाइल नाम नहीं पाया जा सकता है (और आमतौर पर कमांड फ़ाइलनाम में केवल अल्फ़ान्यूमेरिक वर्ण, प्लस अंडरस्कोर, डैश और डॉट्स) होना चाहिए। हालांकि वास्तव में ऐसे फिल्मनाम होना संभव है, जिनमें विशेष चरित्र होते हैं, लेकिन इसे हमेशा टाला जाता है।

नोट : जैसा कि आपके उदाहरण में दिखाया गया व्यवहार बोर्न-जैसे गोले के लिए विशिष्ट है, सहित bash, dash(उबंटू पर इसे सीलिंक किया गया है /bin/sh) ksh, और mkshcshऔर इसके डेरिवेटिव इस तरह से व्यवहार नहीं करते हैं:

$ tcsh                                                    
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%  

हालांकि, इंटरैक्टिव मोड में, cshअभी भी बढ़ा देंगे ?के रूप में prompt2 जब अधिक इनपुट की जरूरत है:

$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3  

यह सभी देखें:


लिंक What's the difference between <<, <<< and < < in bash?ऑफलाइन / गलत है।
Tico

@ टिको धन्यवाद तय। उत्तर प्रति सेकंड मिलि-कछुओं की इंटरनेट गति के साथ लिखा गया था, जिसके परिणामस्वरूप केवल आंशिक रूप से कॉपी की गई लिंक थी। अब तय किया गया
सेर्गेई कोलोडियाज़नी

3
इस बीच, zsh वास्तव में आपको यह बताने के लिए पर्याप्त है कि वह किस चीज का इंतजार कर रहा है, जो कभी-कभार उपयोगी होता है यदि आपको लगता है कि आपकी आज्ञा मान्य थी लेकिन कुछ बचना भूल गया।
केविन

30

खोल केवल समापन बोली का इंतजार कर रहा है। जब आप इसे दर्ज करते हैं, तो यह वही करेगा जो आमतौर पर करता है, और दर्ज की गई कमांड को निष्पादित करने का प्रयास करता है।

उद्धरण विशेष अक्षरों की व्याख्या नहीं करने के कारण शेल का कारण बनता है, जिसका अर्थ है कि विस्तार नहीं किया जाता है। एकल उद्धरण विशेष वर्णों की सभी व्याख्या को पूरी तरह से दबा देते हैं। आम तौर पर एक नई पंक्ति आज्ञाओं को अलग करती है, लेकिन यहां आपने नई पंक्तियों को कमांड के हिस्से के रूप में शामिल किया है।

चूंकि ऐसा कोई आदेश <newline>ls<newline>नहीं है, इसलिए यह नहीं मिला है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.