Pipes e como usá-los no bash

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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *