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

0

"ls -l | wc -l" gera "1 + nenhum arquivo / diretório" (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 temp). O valor armazenado no arquivo temporário é 1 a mais que o valor que foi gerado sem redirecionamento. Eu 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 a mesma que a saída sem redirecionamento.

Alguém por favor me ajude

user2412443
fonte

Respostas:

5

Esse é 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 na ordem da esquerda para a esquerda e só depois executa os comandos reais.

Portanto, o arquivo de redirecionamento (temp) é criado ANTES que o comando ls seja executado.
Deve 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 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 manipulador de arquivos que será a entrada para wc.

Embora pareça um pouco lógico no começo, isso faz todo o sentido quando você entende como os shells constroem sua sequência de comandos.

Tonny
fonte
0

O shell realmente cria o temparquivo antes de começar a executar os comandos, para que você sempre veja o temparquivo contado. Se você não quer que ele contou, coloque o arquivo temporário em outro lugar, como talvez no /tmp. Ou apenas subtraia um da contagem que você obtém.

jjlin
fonte