Vedo comandi come questo in alcuni script: /bin/cat somefile | someprogram
. Vorrei sapere come leggere lintera pipe nello stesso modo in cui fa un programma. Quindi, quando eseguo /bin/cat something | myprogram.sh
, myprogram.sh ha una variabile chiamata mypipevar uguale a tutto ciò che è stato reindirizzato: tutto il testo pipe. Se questo non è chiaro, fammelo sapere. Ho letto che la lettura probabilmente non funzionerà e bash potrebbe non essere la shell giusta.
Risposta
La pipe si collega stdout
di un programma a stdin
di un altro, quindi nel tuo script devi semplicemente leggere da stdin
e otterrai ciò che il comando precedente ha stampato. Un modo semplice per leggere questo in una variabile è con cat, ad esempio, allinterno di myprogram.sh
:
mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar""
Tuttavia, abbastanza spesso vuoi elaborare le cose riga per riga piuttosto che tutte in una volta, questo può essere fatto con
while read line do echo "$line" done < "${1:-/dev/stdin}"
Nota che ${1:-/dev/stdin}
ti darà il primo argomento, o se non sono specificati argomenti allora /dev/stdin
che conterrà il contenuto di stdin che può essere letto come un file. Ciò ti consente di eseguire lo script come command | script
o semplicemente come script filename
.