Isso só funciona porque tr
não altera o tamanho do arquivo.
1<>file
abre file
como saída padrão no modo sobrescrever. ( <>
é chamado modo de leitura / gravação, mas como poucos programas leem stdout
, é mais útil se concentrar no que realmente faz.)
Normalmente, quando você redireciona a saída ( >file
), o arquivo é aberto no modo "gravação", o que faz com que seja criado ou esvaziado. Outra opção comum é >>file
, modo "anexar", que pula a etapa em que o arquivo é esvaziado, mas coloca todas as saídas no final. 1<>file
também ignora o esvaziamento do arquivo, mas coloca o cursor de gravação no início do arquivo. (Você precisa do 1
porque <>
usa como padrão o redirecionamento de stdin
, não stdout
).
Isso é útil apenas ocasionalmente, já que muito poucas utilidades são tão precisas em sua modificação. Outro caso seria uma pesquisa e substituição, onde a substituição é exatamente o mesmo comprimento que o original. (Um substituto mais curto também não funcionaria, porque o arquivo não é truncado no final; se a saída for menor do que a original, você acabaria com o que costumava ser no final do arquivo, ainda no final. do arquivo.)