ls -l | A saída wc -l é diferente quando redirecionada para um novo arquivo

0

"ls -l | wc -l" produz "1 + nenhum arquivo / diretórios" (um extra para a primeira linha).

No entanto, quando eu executo o comando ls -l | wc -l > temp (quando a saída é redirecionada para um novo arquivo temp). O valor armazenado no arquivo temporário é 1 maior que o valor que foi gerado sem redirecionamento.    Eu acho que é por causa do novo arquivo "temp" criado, mas o arquivo temporário deve ter sido criado depois que o comando ls -l foi executado e, portanto, a saída deve ser a mesma que a saída sem redirecionamento.

Alguém por favor ajude

    
por user2412443 03.10.2013 / 20:34

2 respostas

5

Este é um comportamento perfeitamente normal.

O que acontece é que o shell (sh, bash, csh, ksh, o que for) lê primeiro a linha de comando inteira.
Em seguida, constrói os processos, pipes e arquivos de redirecionamento na direita para a ordem esquerda e só então executa os comandos reais.

Portanto, o arquivo de redirecionamento (temp) é criado ANTES que o comando ls seja executado.
Tem que ser, porque o identificador de arquivo associado a "temp" precisa estar disponível para ser usado como destino para a saída do wc, antes que o wc seja realmente iniciado.
O comando wc, por sua vez, precisa ser configurado, antes que a saída de ls possa ser anexada ao filehandle que será a entrada para o wc.

Embora pareça um pouco não-lógico a princípio, isso faz muito sentido quando você entende como as shells constroem sua sequência de comandos.

    
por 03.10.2013 / 20:45
0

O shell na verdade cria o arquivo temp antes de começar a executar os comandos, assim você sempre verá o arquivo temp contado. Se você não quiser que seja contado, coloque o arquivo temporário em outro lugar, como talvez em /tmp . Ou apenas subtraia um da contagem que você recebe.

    
por 03.10.2013 / 20:37

Tags