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 é:
- a saída (fd 0) é para um arquivo regular; e
- 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 - 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>