Em <<<"$(<file)"
(suportado por zsh
(onde <<<
foi introduzido pela primeira vez, inspirado pelo mesmo operador na porta Unix de rc
), ksh93
(o operador $(<file)
foi introduzido por ksh
), mksh
e bash
),
Para $(<file)
, o shell lê o conteúdo de file
(engasga em bytes NUL, exceto zsh
), remove todos os caracteres de nova linha e faz a expansão de $(<file)
(portanto, o conteúdo de o arquivo é armazenado como um todo na memória).
Para <<< some-text
, o shell armazena some-text
seguido por um caractere de nova linha em um arquivo temporário e abre esse arquivo temporário no descritor de arquivo 0.
Então, basicamente <<<"$(<file)"
abre o stdin para leitura em uma cópia temporária de file
, em que caracteres de nova linha foram substituídos por apenas um (e com vários desvios se o arquivo contiver bytes NUL, exceto zsh
). / p>
Enquanto em < file
, é file
que é aberto diretamente para leitura em stdin.
É claro que < file
é muito mais eficiente (não envolve uma cópia no disco e na memória), mas pode-se querer usar o <<<"$(<file)"
para garantir que o arquivo aberto no stdin seja um regular , ou para garantir que o arquivo foi totalmente lido no momento em que o comando é iniciado (caso esse comando grave nele) ou outro redirecionamento for processado (como um que truncará file
como em tr 1 2 <<< "$(<file)" > file
).
Observe que yash
suporta o operador <<<
(embora o implemente com um pipe (portanto, não um arquivo regular ) em vez de um arquivo temporário). mas não o $(<file)
one. Você pode usar <<<"$(cat < file)"
em vez disso. yash
strings são apenas caracteres, então o "$(cat < file)"
irá se engasgar com sequências de bytes que não formam caracteres válidos, enquanto outros shells normalmente podem lidar com eles.