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>