जब मैं '
टर्मिनल में एकल उद्धरण दर्ज करता हूं तो यह किसी अन्य मोड में चला जाता है, और कमांड निष्पादित नहीं करते हैं। यह मोड क्या है और हम इसका उपयोग कब करते हैं?
root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
'
)
जब मैं '
टर्मिनल में एकल उद्धरण दर्ज करता हूं तो यह किसी अन्य मोड में चला जाता है, और कमांड निष्पादित नहीं करते हैं। यह मोड क्या है और हम इसका उपयोग कब करते हैं?
root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
'
)
जवाबों:
प्रभावी रूप से, शेल एक पूर्ण कमांड / अभिव्यक्ति के लिए कहता है , और इस कारण से 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
, और mksh
। csh
और इसके डेरिवेटिव इस तरह से व्यवहार नहीं करते हैं:
$ 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?
ऑफलाइन / गलत है।
खोल केवल समापन बोली का इंतजार कर रहा है। जब आप इसे दर्ज करते हैं, तो यह वही करेगा जो आमतौर पर करता है, और दर्ज की गई कमांड को निष्पादित करने का प्रयास करता है।
उद्धरण विशेष अक्षरों की व्याख्या नहीं करने के कारण शेल का कारण बनता है, जिसका अर्थ है कि विस्तार नहीं किया जाता है। एकल उद्धरण विशेष वर्णों की सभी व्याख्या को पूरी तरह से दबा देते हैं। आम तौर पर एक नई पंक्ति आज्ञाओं को अलग करती है, लेकिन यहां आपने नई पंक्तियों को कमांड के हिस्से के रूप में शामिल किया है।
चूंकि ऐसा कोई आदेश <newline>ls<newline>
नहीं है, इसलिए यह नहीं मिला है।