2010-09-16 13:40:08 +0000 2010-09-16 13:40:08 +0000
88
88

Como canalizar o comando de saída para outros comandos?

Exemplo:

ls | echo não imprime nada ( uma linha em branco, na verdade ). Esperava que imprimisse uma lista de ficheiros.

ls | grep 'foo', por outro lado, funciona como esperado ( imprime ficheiros com ‘foo’ no seu nome ).

O que eu faço nestas situações é algo parecido: ls | while read OUT; do echo $OUT; done& mas isto é bastante complicado.

Porque é que a canalização funciona com alguns comandos, mas não com outros ? Como posso contornar esta questão ?

Respostas (4)

123
123
123
2010-09-16 14:16:59 +0000

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.

19
19
19
2010-09-16 13:54:37 +0000

ls | echo imprime apenas uma linha em branco porque echo não lê nenhuma entrada; o último comando do gasoduto é na realidade echo que não imprime nada mais do que uma linha em branco.

em geral:

a | b

assegura que a saída de a se torne a entrada de b. Sugiro que leia a secção Pipelines de man bash.


Se realmente quiser usar ls e echo juntos, aqui estão alguns exemplos (bastante inúteis):

ls | xargs -L 1 echo
echo `ls`
for i in `ls` ; do echo $i ; done
13
13
13
2010-09-16 14:03:04 +0000

Se quiser echo o comando ls tente:

ls | xargs echo

Isto chamará echo com a saída de ls.

3
3
3
2011-11-09 09:48:27 +0000

Porque não simplesmente usar:

echo `ls`

Ou muito mais seguro:

echo "`ls -lrt`"