Existe uma distinção entre argumentos de linha de comando e entrada padrão. Um tubo conectará a saída padrão de um processo à entrada padrão de outro. Então
ls | echo
Conecta a saída padrão de ls à entrada padrão do eco. Bem certo? Bem, echo ignora a entrada padrão e despejará seus argumentos de linha de comando - que neste caso não são nenhum - para seu próprio stdout. A saída: nada mesmo.
Existem algumas soluções neste caso. Uma delas é usar um comando que leia stdin e dumps para stdout, como cat.
ls | cat
Vai 'funcionar', dependendo da sua definição de trabalho.
Mas e sobre o caso geral. O que você realmente quer é converter stdout de um comando em argumentos de linha de comando de outro. Como outros disseram, xargs
é a ferramenta auxiliar canônica nesse caso, lendo seus argumentos de linha de comando para um comando de seu stdin e construindo comandos para executar.
ls | xargs echo
Você também pode converter isso, usando o comando de substituição $()
echo $(ls)
Também faria o que você quer.
Ambas as ferramentas são básicas para o shell de scripts, você deve aprender as duas coisas.
Para completar, como você indica na pergunta, a outra forma básica de converter stdin em argumentos de linha de comando é o comando read
embutido do shell. Ele converte "palavras" (palavras definidas pela variável IFS
) em uma variável temporária, que você pode usar em qualquer execução de comando.