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

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

"ls -l | wc -l" gera "1+no. file/directories"(um extra para a primeira linha).

No entanto, quando executo o comando ls -l | wc -l > temp (quando a saída é redirecionada para um novo arquivo temporário). O valor armazenado no arquivo temporário é 1 a mais que o valor que foi gerado sem redirecionamento. Acho que é por causa do novo arquivo "temp" criado, mas o arquivo temporário deveria ter sido criado após a execução do comando ls -l e, portanto, a saída deve ser igual à saída sem redirecionamento.

Alguém por favor ajude

Responder1

Este é um comportamento perfeitamente normal.

O que acontece é que o shell (sh, bash, csh, ksh, qualquer que seja) primeiro lê toda a linha de comando.
Em seguida, constrói os processos, canais e arquivos de redirecionamento emordem da direita para a esquerdae só então executa os comandos reais.

Portanto, o arquivo de redirecionamento (temp) é criado ANTES do comando ls ser 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 wc, antes que wc seja realmente iniciado.
O comando wc, por sua vez, precisa ser configurado, antes que a saída de ls possa ser anexada ao identificador de arquivo que será a entrada para wc.

Embora pareça um pouco ilógico a princípio, isso faz todo o sentido quando você entende a maneira como os shells constroem sua sequência de comandos.

Responder2

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

informação relacionada