A principal coisa a ter em conta aqui é que os filhos herdam os descritores de arquivo STDIN / STDOUT / STDERR de seus pais. Ou seja, se você iniciar um script com STDIN conectado ao STDOUT de outro processo (um pipe, como o seu exemplo), qualquer coisa iniciada por esse script também terá STDIN conectado ao mesmo STDOUT do outro processo.
Isso significa que você faz echo foo | ./myscript.sh
, em que myscript.sh
é:
#!/bin/bash
sed -e 's/foo/bar/'
, em seguida, sed
lerá o echo foo
e gravará no STDOUT (que será conectado ao seu TTY, pois não foi redirecionado quando myscript.sh
foi lançado).
Exemplo:
$ echo foobar | ./myscript.sh
barbar
Então, como você usa isso depende do que você quer fazer. Se você simplesmente quiser capturar a entrada em uma variável, poderá usar o read
incorporado para fazer isso.
Por exemplo:
#!/bin/bash
IFS= read -rd '' foo
echo "foo=<$foo>"
O que resulta em:
$ echo -e 'hello\nworld' | ./myscript.sh
foo=<hello
world>