Há uma distinção entre os argumentos de linha de comando e a entrada padrão. Um tubo irá ligar a saída padrão de um processo à entrada padrão de outro. Assim
ls | echo
Liga a saída padrão de ls à entrada padrão de eco. Certo? Bem, a echo ignora a entrada padrão e descarta os seus argumentos de linha de comando - que neste caso são nenhuns - a sua própria stdout. A saída: nada.
Há algumas soluções neste caso. Uma é usar um comando que lê stdin e despeja para stdout, como por exemplo cat.
ls | cat
‘funcionam’, dependendo de qual é a sua definição de trabalho.
Mas e quanto ao caso geral? O que realmente deseja é converter stdout de um comando para args de linha de comando de outro. Como outros já disseram, xargs
é a ferramenta de ajuda canónica neste caso, lendo os seus args de linha de comando para um comando da sua stdin, e construindo comandos para correr.
ls | xargs echo
Também poderia converter este alguns, usando o comando de substituição $()
echo $(ls)
Faria também o que desejasse.
Ambas estas ferramentas são bastante fulcrais para a shell scripting, deverá aprender ambas.
Para completar, como indica na pergunta, a outra forma de base para converter stdin para args de linha de comando é a construção da shell read
comando. Converte “palavras” (palavras como definidas pela variável IFS
) para uma variável temporária, que pode ser utilizada em qualquer execução de comando.