Considere os seguintes comandos:
$ awk 'BEGIN { system("ed") }'
q
$ echo hello | awk 'BEGIN { system("ed") }'
?
$
No primeiro caso, consegui executar ed e então permanecer no editor e sair manualmente com o comando q; mas no segundo, ed saiu automaticamente. Por que a sessão interativa ed não funciona no segundo comando? Existe alguma maneira de executar a função do sistema AWK para chamar um comando interativo enquanto estiver em um pipeline?
No primeiro caso, você deixou o stdin (e o stdout) sozinhos, então
ed
lê do terminal e obtém a entrada que você digita no terminal. No segundo caso, você redirecionou o stdin deawk
e, portanto, tambémed
para o stdout doecho
comando/processo, entãoed
obtém como entrada a linha 'hello' que não é umed
comando válido, seguido por um EOF que com o buffer vazio faz com que ele saia (como umq
comando), como se você desse o comando de shell interativoed
e imediatamente digitasse control-D ou equivalente.Você pode executar
ed
interativamente redirecionando de volta para o terminal:system("ed </dev/tty")
. Mas isso não realiza nada que você não obtenha apenas executandoed
diretamente do shell, então por que se preocupar?