एचएआर-दस्तावेज़ के साथ बैश की प्रक्रिया प्रतिस्थापन को कैसे संयोजित करें?


14

बैश संस्करण में 4.2.47 (1) -Reease जब मैं प्रारूपित पाठ को पूरा करने की कोशिश करता हूं जो कि HERE-dcoument से आता है जैसे:

cat <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
) # I want this paranthesis to end the process substitution.

मुझे निम्नलिखित त्रुटि मिलती है:

bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
)

इसके अलावा, मैं HERE- दस्तावेज़ को उद्धृत नहीं करना चाहता, अर्थात लिखता <'FOOBAR'हूं, क्योंकि मैं अभी भी चाहता हूं कि चर को इसके भीतर प्रतिस्थापित किया जाए।


क्या आपको वास्तव में catकॉल की आवश्यकता है ? इसे कॉल करने पर क्यों नहीं छोड़ते fmt?
इरुवर

2
मुझे मानना ​​चाहिए कि यह एक आकस्मिक उदाहरण है। मेरी वास्तविक जरूरतें उससे कहीं अधिक जटिल हैं।
टिम फ्रिस्क

1
यह दिलचस्प है कि जब आप इसके (Evenसाथ "(Even"काम करते हैं। इसके लिए समान है \(Even। एक पार्सिंग बग जैसा दिखता है। बैश अभी भी एक संदर्भ में है क्योंकि यह ब्रेसिज़ की तलाश में था जबकि यहां डॉक्स को पढ़ने के संदर्भ में भी और दोनों संदर्भ एक-दूसरे के विपरीत हैं।
राफेल अहरेंस ने

1
यह bashसंयोगवश ४.३ में तय किया गया है ।
15

जवाबों:


7

प्रक्रिया प्रतिस्थापन इस के लगभग बराबर है।

उदाहरण - प्रक्रिया प्रतिस्थापन के यांत्रिकी

चरण # 1 - इसे बनाने के लिए एक 85o, आउटपुट करें

$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492

चरण # 2 - पंद्रो पढ़ें

$ cat /var/tmp/fifo1
1 2 3 4
5 6 7 8
9 10
[1]+  Done                    fmt --width=10 <<< "$(seq 10)" > /var/tmp/fifo1

HEREDOC के भीतर परनों का उपयोग भी ठीक लगता है:

उदाहरण - सिर्फ एक फीफो का उपयोग करना

चरण # 1 - FIFO को आउटपुट

$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628

चरण # 2 - फीफो की सामग्री पढ़ें

$ cat /var/tmp/fifo1
(one)
(two

मुसीबत, मुझे लगता है कि आप में चल रहे हैं कि इस प्रक्रिया प्रतिस्थापन, <(...)इसके भीतर parens के घोंसले के लिए देखभाल करने के लिए प्रतीत नहीं होता है।

उदाहरण - प्रक्रिया उप + HEREDOC काम नहीं करती है

$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOO
(one)
(two
FOO
)
$

Parens को बचाना यह अपील करता है, थोड़ा:

उदाहरण - बचते हुए परिंदे

$ cat <(fmt --width=10 <<FOO                 
\(one\)
\(two
FOO
)
\(one\)
\(two

लेकिन वास्तव में आपको वह नहीं देता जो आप चाहते हैं। Parens को संतुलित बनाना भी इसे अच्छा लगता है:

उदाहरण - संतुलन साधना

$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)

जब भी मेरे पास जटिल तार होते हैं, जैसे कि बैश में इसके साथ मुकाबला करने के लिए, मैं लगभग हमेशा उन्हें पहले बनाऊंगा, उन्हें एक चर में संग्रहीत करूंगा, और फिर उन्हें चर के माध्यम से उपयोग करूंगा, बजाय कोशिश और शिल्प के कुछ पेचीदा एक लाइनर जो समाप्त हो रहा है नाजुक।

उदाहरण - एक चर का उपयोग करें

$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)

फिर इसे प्रिंट करने के लिए:

$ echo "$var"
(one)
(two

संदर्भ


3

यह सिर्फ एक वर्कअराउंड है। प्रक्रिया प्रतिस्थापन का उपयोग fmtकरने के catबजाय पाइप

fmt --width=10 <<FOOBAR | cat 
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR

1
मैंने आपके "वर्कअराउंड" की कोशिश की और यह मेरे लिए काम करेगा। धन्यवाद। लेकिन फिर भी मैं समझ लेना चाहता हूं कि एक HERE- दस्तावेज़ के मेरे संयोजन एक प्रक्रिया प्रतिस्थापन के अंदर नेस्टेड क्यों काम नहीं करता है। क्या आपको जवाब मिला है?
टिम फ्रिस्क

@TimFriske, मुझे लगता है कि bashइस साइट पर एक जादूगरों में से एक को स्थगित करना होगा। बैश पारसर इंटर्नल के बारे में मेरा ज्ञान कम से कम
इरुवर

2

यह एक पुराना प्रश्न है, और जैसा कि आप समझते हैं कि यह एक आकस्मिक उदाहरण है (और इस प्रकार कि सही समाधान का उपयोग करना है cat |या वास्तव में, catइस मामले में बिल्कुल भी नहीं ), मैं सिर्फ सामान्य मामले के लिए अपना उत्तर दूंगा। मैं इसे एक फ़ंक्शन में डालकर और इसके बजाय इसका उपयोग करके हल करूंगा।

fmt-func() {
    fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
}

और फिर उस का उपयोग करें

cat <(fmt-func)

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