Pipes e como usá-los no bash

1

Eu vejo comandos como este em alguns scripts: /bin/cat somefile | someprogram . Eu gostaria de saber como ler o pipe inteiro da mesma forma que um programa faz. Então, quando eu executo /bin/cat something | myprogram.sh , myprogram.sh tem uma variável chamada mypipevar igual ao 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 certo.

    
por paulj 27.10.2017 / 14:59

1 resposta

5

O pipe conecta stdout de um programa a stdin de outro, portanto, no 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, muitas vezes você quer 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} fornecerá 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 .

    
por 27.10.2017 / 15:05