"कैट> file_name << blah" कमांड को कैसे समझें?


13

निम्न आदेश में बिल्ली यहाँ की सामग्री को लेती है-doc और इसे पुनः नामांकित करता है जिसे फ़ाइल नाम दिया गया है:

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF

यहां आज्ञाओं के क्रम को कैसे समझा जाए? क्या bashपहले सब कुछ प्रक्रिया करता है (यहाँ-डॉक्टर भाग) और अंतिम चरण के रूप में यह > confभाग दिखता है ?

जवाबों:


17

यहां-दस्तावेज़ एक प्रकार का शेल पुनर्निर्देशन है, इसलिए शेल इसे सामान्य पुनर्निर्देशन के रूप में शुरू से अंत तक (या बाएं से दाएं, या उपस्थिति के क्रम) के रूप में प्रदर्शन करेगा। यह POSIX द्वारा परिभाषित है:

यदि एक से अधिक पुनर्निर्देशन ऑपरेटर एक कमांड के साथ निर्दिष्ट किया जाता है, तो मूल्यांकन का क्रम शुरू से अंत तक है।


आपके आदेश में, लिखने के लिए पहले, खुली और ट्रंकट फ़ाइल का catप्रदर्शन करेंगे , फिर डेटा पढ़ना ।> confconfHere-Document

का उपयोग करते हुए strace, आप इसे सत्यापित कर सकते हैं:

$ strace -f -e trace=open,dup2 sh -c 'cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
'
...
open("conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(3, 0)                              = 0
...

समझा। तो मूल रूप से ऐसा क्या होता cat > file_name << blahहै कि निष्पादित करने catसे पहले शेल के स्टडआउट को फाइल की गई फ़ाइल से जोड़ा जाता है file_nameऔर फिर शेल का स्टैडेन यहाँ से जुड़ा है ?
मार्टिन

@ मरीन: हाँ। आप देख सकते हैं openपहले कहा जाता था dup2
cuonglm

12

खैर, आइए जानें:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

डैंग। मुझे लगता है कि यह >"$file"पहले भाग कर रहा होगा । पर क्या अगर...?

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

...कोई त्रुटि नहीं...?

cat ./myfile

this is in ./myfile

जैसा कि प्रतीत होता है, आदेश मायने रखता है।


-1

जब bashचलाने की प्रक्रिया बनती है cat, तो यह confफाइल डिस्क्रिप्टर 1 पर लिखने के लिए खुलता है और execप्रोग्राम के पहले फाइल डिस्क्रिप्टर 0 पर पढ़ने के लिए एक अस्थायी फाइल (यहां-दस्तावेज के लिए) खोलता है । इस मामले में, यह वास्तव में कोई फर्क नहीं पड़ता कि किस क्रम में वे कार्य होते हैं।

जब फ़ाइल विवरणकों को पुन: असाइन किया जाता है, उदाहरण के साथ आदेश महत्वपूर्ण हो जाता है 2>&1

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