Pipes e come usarli in bash

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *