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.