क्या यह संभव है कि यहां कई डॉक्स का उपयोग बैश में किया जाए?


14

क्या bash में किसी कमांड को इनपुट प्रदान करने के लिए कई यहाँ डॉक्स का उपयोग किया जा सकता है?

$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar

जाहिर है, दोनों ही मामलों में, यहां दूसरा-डॉक का उपयोग स्टड के रूप में किया जाता है, और पहले संदर्भ को बदल देता है। echoइसके बजाय का उपयोग करने के लिए समाधान है ?

$ cat <(echo -n foo) <(echo bar)
foobar

इसके अलावा, किसी कारण से, संयोजन का उपयोग करना मेरे लिए काम नहीं करता था। ऐसा क्यों होगा?

$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo

क्या इस तथ्य के पीछे कोई कारण है कि आप एक में संयोजन करने के बजाय यहां दो-दस्तावेजों का उपयोग करना चाहते हैं?
सेम

1
@ डीन मैं वास्तव में pasteडमी इनपुट के साथ परीक्षण करते समय उसमें भाग गया । मुझे लगता है कि मैं कुछ अन्य परिदृश्यों के बारे में सोच सकता हूं। अगर मेरे पास कुछ चर में पूर्व-तैयार पाठ के साथ एक स्क्रिप्ट थी, तो मैं उदाहरण के लिए केवल एक फाइल के साथ दोनों के लिए कुछ करना चाहता हूं diff
स्पार्हॉक

एक अन्य उपयोग-मामला (मैंने शेल स्क्रिप्ट बनाने के लिए यहां-डॉक्स का उपयोग करके पाया): आप चर विस्तार के साथ कुछ पंक्तियां चाहते हैं और फिर बिना कुछ पंक्तियाँ cat <<EOF1 <<"EOF2":।
टोबी स्पाइट

जवाबों:


18

तुम कर सकते हो:

cat /dev/fd/3 3<< E1 /dev/fd/4 4<< E2
foo
E1
bar
E2

वहाँ केवल एक स्टडिन हो सकता है, क्योंकि केवल एक फ़ाइल डिस्क्रिप्टर 0 है।

cat << EOF
eof
EOF

इसके लिए छोटा है:

cat /dev/fd/0 0<< EOF
eof
EOF

तथा:

cat <<< foo

है:

cat /dev/fd/0 0<<< foo

आपको अपना मन बनाना होगा कि फाइल डिस्क्रिप्टर 0 पर क्या खोला जाए।

cat <(echo foo)

है:

cat /dev/fd/123

जहां 123एक पाइप के लिए एक फ़ाइल डिस्क्रिप्टर है, और समानांतर में, echo fooएक अन्य प्रक्रिया में बैश चलता है, जिसमें स्टडआउट पाइप के दूसरे छोर पर पुनर्निर्देशित होता है।

एक बार जब आप करने के लिए एक फ़ाइल नाम से पारित cat, catअब stdin से पढ़ें। आपको आवश्यकता होगी:

cat <(echo foo) /dev/fd/0 << EOF
bar
EOF

या:

cat <(echo foo) - << EOF
bar
EOF

( स्टडिन से पढ़ने के -लिए बताने के catलिए है)।


1
cat <<EOFजैसा है वैसा नहीं है cat /dev/fd/0...: बाद वाले मामले catमें फ़ाइल का नाम देखता है और खुला करता है।
मिकेल

@ मिकेल, मेरा मतलब है कि यह कार्यात्मक रूप से समतुल्य है । जब किसी भी तर्क को पारित नहीं किया जाता है, तो catइसके fd0 से पढ़ता है , जैसे कि ( -या /dev/fd/0लिनक्स (और लिनक्स पर केवल) का एक तर्क पारित किया गया है, उद्घाटन /dev/fd/0बिल्कुल फ़ाइल डिस्क्रिप्टर 0 की नकल करने जैसा नहीं है।
स्टीफन चेज़लस

मैं /dev/fd/3 3<< E1निर्माण से बहुत आश्चर्यचकित था और मुझे आश्चर्य है कि अब वास्तव में / देव / fd / के तहत क्या आइटम हैं। हालांकि मैं किसी भी तरह से जादुई दिखाई देता हूं क्योंकि प्रक्रिया के बाद फाइल सिस्टम पर 1 और 2 के अपवाद के साथ कहीं एक फाइल खुलती है जो हर प्रक्रिया के लिए डिफ़ॉल्ट रूप से होती है। लेकिन आपके उदाहरण में आप फ़ाइल डिस्क्रिप्टर 3 और 4 का उपयोग कर रहे हैं जो कि इनपुट पुनर्निर्देशन के अलावा किसी भी वास्तविक फ़ाइल से जुड़े नहीं हैं। मैं फ़ाइल डिस्क्रिप्टर के अपने मानसिक मॉडल में यह समझ नहीं सकता। क्या होगा अगर प्रक्रिया एक और फ़ाइल खोलना चाहती है, तो क्या यह पता चलेगा कि इसे fd 5 का उपयोग करना है? क्या fds को 3, 4, 5 होना चाहिए .. या कुछ भी हो सकता है?
calavera.info

@ calavera.info, ऐसा लगता है कि आप एक अनुवर्ती प्रश्न बनाना चाहते हैं।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.