Como o redirecionamento de entrada / saída do shell “1file” funciona?

1

Eu vi esse trecho de código em outra pergunta, mas não pude comentar a resposta, então estou perguntando aqui.

tr '\n' '
tr '\n' '%pre%' < file 1<> file
' < file 1<> file

Estou interessado na parte 1<> , nunca vi isso antes e não consegui encontrar nada de útil no Google.

    
por Spartan-117 31.03.2018 / 14:02

1 resposta

2

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.

    
por 31.03.2018 / 14:42