Para que seu comando detecte eof
, ele precisa ler stdin. Então, presumivelmente, está esperando alguma entrada. Então, parece que o que você precisa não é uma entrada vazia ( /dev/null
é exatamente para isso), mas a entrada que nunca chega.
Pode ser simulado com um tubo onde ninguém nunca vai escrever do outro lado como:
sleep 999999999 | the-command
Ou para evitar a necessidade de executar esse comando sleep
extra, isso pode ser feito com um pipe nomeado:
fifo=$(mktemp -u) &&
mkfifo "$fifo" &&
(rm "$fifo" && the-command <&3 3<&- &) 3<> "$fifo"
Aqui, usando um descritor de arquivo intermediário para contornar o fato de que o shell conecta stdin a /dev/null
implicitamente quando você inicia um comando com &
(a menos que você adicione um redirecionamento stdin explícito como nosso <&3
aqui). / p>
No Linux (e provavelmente no Linux apenas), você também pode fazer:
the-command < /dev/fd/1 3>&1 > /dev/null | :
/dev/fd/1
onde o fd 1 está conectado a um pipe, no Linux, se comporta como um pipe nomeado. Isto é, quando você o abre no modo de leitura, você obtém o final da leitura do pipe.
Assim, acima, o fd 0 será conectado à extremidade de leitura de um canal cuja outra extremidade está no fd 3 de the-command
. Porque the-command
não vai escrever nada no seu fd 3, qualquer read
tentativa em fd 0 irá bloquear (ou uma leitura sem bloqueio retornará com não há nada para ler ainda , ou um select / poll retornará nada para ler como the-command
provavelmente está fazendo, se estiver fazendo qualquer outra coisa além de esperar por entradas que nunca aparecem.