क्या मैं शेल स्क्रिप्ट तर्क के रूप में पाइप आउटपुट का उपयोग कर सकता हूं?


22

मान लीजिए कि मेरे पास एक बैश शेल स्क्रिप्ट है जिसे Myscript.shइनपुट के रूप में एक तर्क की आवश्यकता है।

लेकिन मैं चाहता हूं कि पाठ फ़ाइल की सामग्री को text.txtवह तर्क कहा जाए।

मैंने यह कोशिश की है, लेकिन यह काम नहीं करता है:

cat text.txt | ./Myscript.sh

क्या इसे करने का कोई तरीका है?

जवाबों:



19

आप शेल स्क्रिप्ट तर्क के रूप में पाइप आउटपुट का उपयोग कर सकते हैं।

इस विधि का प्रयास करें:

cat text.txt | xargs -I {} ./Myscript.sh {}

2

यदि आपके पास फ़ाइल में एक से अधिक कमांड हैं, तो xargs या समानांतर का उपयोग करने पर विचार करें , जैसे

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt

0

प्रयत्न,

 $ cat comli.txt
 date
 who
 screen
 wget

 $ cat comli.sh
 #!/bin/bash
 which $1

 $ for i in `cat comli.txt` ; do ./comli.sh $i ; done

ताकि आप मूल्यों के लिए एक के बाद एक प्रवेश कर सकते हैं comli.shसे comli.txt



0

मैपफाइल के साथ स्टडिन को पढ़ने से आप स्थितीय मापदंडों को फिर से सेट कर सकते हैं।

#!/bin/bash

[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; }

for i in $@; do
    echo "$((++n)) $i"
done

("$ @" उद्धृत forकरने के बजाय लूप लाइनें बनाएंगे )।

$ cat test.txt | ./script.sh
1 one
2 two
3 tree

0

@ Bac0n को पूरा करने के लिए जो IMHO प्रश्न का सही उत्तर देने के लिए एकमात्र है, यहां एक लघु-लाइनर है जो आपकी स्क्रिप्ट तर्क सूची में पाइप किए गए तर्कों को प्रस्तुत करेगा:

#!/bin/bash
args=$@
[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; set -- $@ $args; }

echo $@

उदाहरण का उपयोग करें:

$ ./script.sh arg1 arg2 arg3
> arg1 arg2 arg3

$ echo "piped1 piped2 piped3" | ./script.sh
> piped1 piped2 piped3

$ echo "piped1 piped2 piped3" | ./script.sh arg1 arg2 arg3
> piped1 piped2 piped3 arg1 arg2 arg3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.