Ho un programma che produce informazioni utili su stdout
ma legge anche da stdin
. Voglio reindirizzare il suo output standard su un file senza fornire nulla sullo standard input. Fin qui tutto bene:posso fare:
program > output
e non fare nulla in tty.
Tuttavia, il problema è che voglio farlo in background. Se lo faccio:
program > output &
il programma verrà sospeso ("sospeso (tty input)").
Se lo faccio:
program < /dev/null > output &
il programma termina immediatamente perché raggiunge EOF.
Sembra che ciò di cui ho bisogno sia un pipe in program
qualcosa che non fa nulla per un periodo di tempo indefinito e non legge stdin
. I seguenti approcci funzionano:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Tuttavia, questo è tutto molto brutto. Ci ha essere un modo elegante, usando le utilità standard di Unix, per "non fare nulla, indefinitamente" (per parafrasare man true
). Come potrei raggiungere questo obiettivo? (I miei criteri principali per l'eleganza qui:niente file temporanei; niente attese o risvegli periodici; niente utilità esotiche; il più breve possibile.)
Risposta accettata:
Nelle shell che li supportano (ksh, zsh, bash4), puoi avviare program
come co-processo.
ksh
:program > output |&
zsh
,bash
:coproc program > output
Questo avvia program
in background con il suo input reindirizzato da una pipe
. L'altra estremità del tubo è aperta al guscio.
Tre vantaggi di questo approccio
- nessun processo aggiuntivo
- puoi uscire dallo script quando
program
muore (usawait
ad aspettarlo) program
terminerà (ottenereeof
sul suo stdin se la shell esce).