Por que um arquivo de entrada não pode ser um arquivo de saída?

2

Especificamente no caso de cat x y > y e cat x >> x , onde x e y são arquivos.

O que aconteceria se eu não obtivesse um erro "arquivo de entrada é arquivo de saída"? Basicamente, por que não tenho permissão para executar esses comandos?

    
por Rabbit 12.04.2018 / 04:13

1 resposta

3

cat x y > y seria o mesmo que cp x y (porque y teria sido truncado pelo tempo em que cat começou) seguido por cat y >> y .

cat x >> x seria um loop infinito até que seu disco estivesse cheio ou você atingisse o limite de tamanho de arquivo do sistema de arquivos (porque ele continua adicionando ao final do arquivo e, em seguida, lendo de volta para adicionar novamente).

Observe que esse "erro" não significa que cat não fez nada - é apenas um aviso de que esse arquivo específico foi ignorado (no GNU cat , pelo menos ). Você está "autorizado" a executá-lo, provavelmente não fez o que você queria e está lhe avisando.

O teste no GNU cat para gerar essa mensagem é:

  1. a saída (fd 0) é para um arquivo regular; e
  2. o dispositivo ( st_dev field) e inode ( st_ino field) são iguais para a saída fd e o arquivo de entrada sob exame; e
  3. o deslocamento no arquivo de entrada é menor que o tamanho do arquivo (portanto, não está vazio; não consigo pensar em um caso em que o deslocamento não seria zero neste momento, mas presumivelmente existe um).

Se todos os que se aplicam, ele imprime o diagnóstico e passa para o próximo arquivo de entrada.

Algumas versões do comando cat não fazem essa verificação e você pode fazer essas coisas acontecerem. Eu posso imaginar um sistema onde eles fazem o cheque e ele não é capaz de dizer que eles são o mesmo arquivo também, apesar de eu não poder lhe contar uma. Em ambos os casos, provavelmente terminará mal. É possível que, em vez de um loop, você acabe com o arquivo duplicado, se a implementação cat fizer apenas uma única gravação de todo o arquivo mapeado por memória, mas isso é apenas um tipo menos grave. p>     

por 12.04.2018 / 04:22