Exemplo:
ls | echo
imprime nada (uma linha em branco, na verdade). Espero que imprima uma lista de arquivos.
ls | grep 'foo'
, por outro lado, funciona conforme o esperado (imprime arquivos com 'foo' no nome).
O que faço nessas situações é algo como:
ls | while read OUT; do echo $OUT; done
mas isso é bastante complicado.
Por que a tubulação funciona com alguns comandos, mas não com outros? Como posso contornar esse problema?
ls | echo
fazer? por que não simplesmente correrls
?git cat-file
, mas simplesmente não funcionou. Aparentemente, o eco tem o mesmo comportamento, então eu o usei como exemplo.Respostas:
Há 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. assim
Conecta a saída padrão de ls à entrada padrão de eco. Tudo bem, certo? Bem, echo ignora a entrada padrão e despeja seus argumentos de linha de comando - que não são, neste caso, - seu próprio stdout. A saída: nada.
Existem algumas soluções nesse caso. Uma é usar um comando que lê stdin e despeja em stdout, como cat.
Irá 'funcionar', dependendo da sua definição de trabalho.
Mas e o caso geral. O que você realmente deseja é converter o stdout de um comando na linha de comando args de outro. Como já foi dito,
xargs
é a ferramenta auxiliar canônica nesse caso, lendo os argumentos da linha de comando para obter um comando a partir do stdin e construindo comandos para execução.Você também pode converter isso alguns, usando o comando de substituição
$()
Também faria o que você quer.
Ambas as ferramentas são essenciais para o shell script, você deve aprender as duas.
Para completar, como você indica na pergunta, a outra maneira básica de converter stdin em args da linha de comando é o
read
comando interno do shell . Ele converte "palavras" (palavras definidas pelaIFS
variável) em uma variável temp, que você pode usar em qualquer execução de comando.fonte
ls | echo
imprime apenas uma linha em branco porqueecho
não lê entrada; o último comando do pipeline é, na verdade,echo
que imprime apenas uma linha em branco.Geralmente:
garante que a saída de
a
se torne a entrada deb
. Eu sugiro que você leia aPipelines
seção deman bash
.Se você realmente deseja usar
ls
eecho
juntos, aqui estão alguns exemplos (bastante inúteis):fonte
Se você deseja
echo
ols
comando, tente:Isso será chamado
echo
com a saída dels
.fonte
ls | xargs -I {} echo {}
se você quer que ele seja chamado para cada linha individualmentePor que não usar simplesmente:
Ou muito mais seguro:
fonte
echo *
.