comandos em execução no piping no UNIX

4

quando escrevo um comando

$ echo date  

em seguida, imprime "data" como é, por exemplo, não executa o programa de data.
Mas quando eu escrevo

$ echo date | wc  

então a resposta correta é produzida como se a data tivesse sido executada. Como a tubulação está fazendo diferença aqui?
Por favor explique.

    
por Happy Mittal 16.04.2010 / 13:16

5 respostas

3

$ echo date | wc
      1       1       5

como contador de bytes == 5 (= sizeof ("date")) parece que a data não foi executada

mas

$ echo date | xargs time

executa a data como comando

    
por 16.04.2010 / 13:27
2

Isso não acontece.

Tente:

echo date | cat > here.out

tente:

echo 'date' | cat > here.out
    
por 16.04.2010 / 13:31
0

O problema é que 'echo' envia o seguinte texto para a saída padrão. O texto, neste caso, é 'date', então o que você mostra não funciona. Isto irá: echo | date porque data agora produz o texto para echo.

    
por 16.04.2010 / 13:29
0

echo 'date' é o que você quer.

    
por 16.04.2010 / 13:53
0

Tem a ver com o modo como o bash usa strings.

Se você olhar o que é armazenado nessas variáveis

d1=date
d2="date"
d3='date'
d4='date'

Você notará que d1, d2 e d3 são apenas strings que contêm "data", d4 no entanto, tem o resultado da data do comando executado.

Se, então, levarmos isso um passo adiante e vermos se podemos encontrar alguma diferença entre essas sequências.

d4='date +%Y%m%d'
echo $d4

Isso significa que agora temos "20100418" armazenado em $ d4.

d3='$d4'
echo $d3

Agora, em $ d3, imprimimos a string "$ d4", exatamente esses 3 caracteres ...

d2="$d4"
echo $d2

Agora aqui nós temos "20100418" armazenado em $ d2 desde que imprimimos $ d4 e salvamos essa saída na variável $ d2.

d1=$d4
echo $d1

E então você tem uma cópia do conteúdo da variável $ d4 na variável $ d1.

Espero que isso esclareça um pouco como essas cordas funcionam.

E agora, voltemos à sua pergunta.

cj@zap:~$ echo date | wc
      1       1       5
cj@zap:~$ echo 'date' | wc
      1       6      31
cj@zap:~$ date | wc
      1       6      31

Agora, o que isso realmente significa? O homem wc nos dá isso:

NAME wc - print newline, word, and byte counts for each file

Então "1 1 5" acabou de nos dizer que temos 1 nova linha, 1 palavra e 5 caracteres, e isso corresponde à data \ n.

E "1 6 31" corresponderá a "sön 18 de abril de 2010 10.07.25 CEST \ n", já que foi isso que meu comando de data me deu ...

    
por 18.04.2010 / 10:08

Tags