Esta foi uma resposta que Stéphane Chazelas escreveu . Ele é um recurso de shell POSIX e não é específico de bash
. Ele será mencionado no manual do seu shell, junto com as descrições dos outros operadores de redirecionamento.
O 1<>file
abre a saída padrão, o descritor de arquivo 1, tanto para leitura quanto para gravação, e o anexa ao arquivo chamado file
no diretório atual.
Antes disso, ele já anexou a entrada padrão do mesmo arquivo.
tr
lerá a partir de sua entrada padrão, de file
, e alterará todos os caracteres de nova linha para caracteres nulos. A saída de tr
é gravada no mesmo arquivo.
Isso funciona enquanto o resultado do comando tr
for exatamente o mesmo que os dados originais em file
.
Se o resultado de tr
for menor que o arquivo original, você terá "dados antigos" no final do arquivo:
$ cat file
too many @ here: @@@@
the end
$ tr -s '@' <file 1<>file
$ cat file
too many @ here: @
the end
nd
Note que ele não pode usar >
como em
tr '\n' 'tr '\n' '$ cat file
too many @ here: @@@@
the end
$ tr -s '@' <file 1<>file
$ cat file
too many @ here: @
the end
nd
' <file >>file
' <file >file
desde que truncaria file
antes de tr
ter a chance de ler a partir dele ( 1<>
não trunca o arquivo de saída, mas o cria se ainda não existir).
Ele também não pode usar >>
como em
tr '\n' 'tr '\n' '%pre%' <file >>file
' <file >file
como isso acrescentaria a saída de tr
no final do arquivo e deixaria os dados antigos no lugar.