O que acontece exatamente se o arquivo de entrada e saída for o mesmo?

5

Digamos que eu execute o seguinte comando:

tr a-z A-Z < file > file

Existem dois redirecionamentos: < file e > file . Ambos são processados antes do comando tr e, até onde eu saiba, se houver vários redirecionamentos, eles serão processados da esquerda para a direita. Em outras palavras, primeiro < file e, em seguida, > file . O < file significa simplesmente que, se o comando iniciar, então stdin vem do arquivo chamado file ? Em seguida, a parte > file é processada e isso significa que a saída é enviada para o arquivo denominado file . Também o arquivo chamado file é truncado para o tamanho zero. Agora, finalmente, os comandos ( tr no meu exemplo) são iniciados, mas como o arquivo de entrada foi truncado para zero na etapa anterior, ele simplesmente processa um arquivo vazio?

    
por Martin 30.04.2016 / 01:55

2 respostas

4

Isso mesmo. > trunca o arquivo antes que o comando seja iniciado, portanto, o comando vê um arquivo de entrada vazio. Na verdade, não importa que os redirecionamentos sejam executados da esquerda para a direita (exceto que você obterá um erro se o arquivo não existir, enquanto >file <file criaria o arquivo primeiro).

Com somecommand <file >>file , na maior parte do tempo, você obterá um loop infinito quando o comando ler sua própria entrada. No entanto, para um arquivo curto, é possível que o comando detecte o final da entrada antes de gravar qualquer coisa, nesse caso, isso se comportará como se a entrada e a saída fossem arquivos separados.

Com somecommand <file 1<>file , é mais complicado. Dependendo se o comando expande ou encolhe o arquivo, ele pode ou não fazer um loop em sua própria entrada. Se o comando sempre encolher o arquivo (por exemplo, grep sem coisas como numeração de linha ou coloração), ou seja, se o byte N da saída sempre depender apenas dos bytes 0..N-1 da entrada, então isso se comportará como se os dois os arquivos eram diferentes. Eu não recomendo confiar nisso: é frágil de várias maneiras e deixa uma bagunça se o comando for interrompido no meio.

    
por 30.04.2016 / 02:12
1

Usar o mesmo arquivo para entrada e saída garante problemas. O problema será iniciado assim que o shell abrir os dois arquivos, porque o arquivo de saída será truncado.

Se você anexar à saída, ela será repetida indefinidamente até que o disco esteja cheio ou o tamanho máximo do arquivo seja atingido.

    
por 30.04.2016 / 02:04