Vejo comandos como este em alguns scripts: /bin/cat somefile | someprogram
. Gostaria de saber como ler todo o tubo da mesma forma que faz algum programa. Portanto, quando executo /bin/cat something | myprogram.sh
, myprogram.sh tem uma variável chamada mypipevar igual a tudo o que foi canalizado – todo o texto do pipe. Se isso não estiver claro, por favor me avise. Eu li que a leitura provavelmente não funcionará e o bash pode não ser o shell correto.
Resposta
O pipe conecta stdout
de um programa para stdin
de outro, portanto, em seu script, basta ler stdin
e você obterá o que o comando anterior imprimiu. Uma maneira simples de ler isso em uma variável é com cat, por exemplo, dentro de myprogram.sh
:
mypipevar="$(cat ${1:-/dev/stdin})" echo "Obtained the value: "$mypipevar""
No entanto, bastante frequentemente você deseja processar as coisas linha por linha em vez de tudo de uma vez, isso pode ser feito com
while read line do echo "$line" done < "${1:-/dev/stdin}"
Observe que ${1:-/dev/stdin}
lhe dará o primeiro argumento, ou se nenhum argumento for especificado, então /dev/stdin
que conterá o conteúdo de stdin que pode ser lido como um arquivo. Isso permite que você execute o script como command | script
ou simplesmente como script filename
.