Em um script de shell, estou tentando iniciar um comando em segundo plano que possui o mesmo stdin do script de shell.
#!/bin/sh
# ...
the-program &
No entanto, the-program
acima não terá acesso à mesma entrada padrão do shell script. De acordo com o manual do meu shell ( dash(1) ):
Se o shell não for interativo, a entrada padrão de um comando assíncrono será definida como
/dev/null
.
Eu tentei the-program & <&0
, mas não parece surtir o efeito pretendido; a entrada padrão de the-program
still é /dev/null
.
Pensei em criar um novo descritor de arquivo duplicando a entrada padrão do shell script e de alguma forma passar esse novo descritor de arquivo para o processo em segundo plano. No entanto, o processo em segundo plano deve então redirecionar de alguma forma esse novo descritor de arquivo para sua entrada padrão (substituindo /dev/null
). Não tenho ideia se essa ideia é possível e não sei como implementá-la no POSIX sh.
Sim, é um requisito irritante da
sh
especificação POSIX que os comandos iniciados de forma assíncrona por invocações de shell não interativas (quando amonitor
opção IOW job control não está habilitada) tenham seu stdin redirecionado para/dev/null.A solução usual é fazer:
O que parece com o que você estava pensando.
Exemplo:
Outra opção é usar
zsh
which ignora esse requisito mesmo nash
emulação: