What precisely is going on when one "passes a heredoc as a file"?
Você não é. Aqui os documentos fornecem informações padrão, como um tubo. Seu exemplo
awk '{ ... }' <<EOF
foo bar baz
EOF
é exatamente equivalente a
echo foo bar baz | awk '{ ... }'
awk
, cat
e ruby
são lidos a partir da entrada padrão, caso não recebam um nome de arquivo para ler na linha de comando. Essa é uma escolha de implementação.
Why does the first version with anisble-playbook fail but second version succeed?
ansible-playbook
não lê a entrada padrão por padrão, mas requer um caminho de arquivo. Esta é uma escolha de design.
/dev/stdin
é muito provável um link simbólico para /dev/fd/0
, que é uma maneira de falar sobre o processo atual descritor de arquivo # 0 (entrada padrão). Isso é algo exposto pelo seu kernel (ou biblioteca do sistema). O comando ansible-playbook
abre /dev/stdin
como um arquivo normal do sistema de arquivos e acaba lendo sua própria entrada padrão, que de outra forma seria ignorada.
Você provavelmente também tem /dev/stdout
e /dev/stderr
links para FDs 1 & 2, que você pode usar também se estiver dizendo algo onde colocar sua saída.
What is the significance of passing /dev/stdin before the heredoc?
É um argumento para o comando ansible-playbook
.
Why do other utilities like ruby or awk not need the /dev/stdin before the heredoc?
Eles lêem a entrada padrão por padrão como uma opção de design, porque eles são feitos para serem usados em pipelines. Eles escrevem na saída padrão pelo mesmo motivo.