2012-02-18 16 views

risposta

21

Si dovrebbe essere in grado di usare l'interruttore -t test per capire se i flussi in uscita sono tty s o meno:

if [ -t 1 ] ; then 
    echo stdout is a terminal 
else 
    echo stdout is not a terminal 
fi 

Usa -t 0 per stdin.

Utilizzare -t 2 per stderr.

+0

funziona come volevo! Grazie mille – Sigmun

25

Tecnicamente non è possibile stabilire se stdin/stdout/stderr siano "reindirizzati" perché non si sa che cosa sta invocando lo script. Se non viene invocato da un'altra shell, non vi è alcun concetto di "reindirizzamento".

Tutto ciò che devi fare è specificare i tipi di descrittori di file in/out/err (terminale, fifo, pipe, dispositivo, file, ecc.). Normalmente vuoi solo scoprire se il tuo output andrà allo schermo di qualche utente o se sta andando a un altro processo. In questo caso utilizzare [ -t 1 ] come da risposta di Mat.

Se si desidera scoprire dove/il processo è stato reindirizzato, esaminare gli obiettivi dei collegamenti simbolici /proc/$$/fd/1 e /proc/$$/fd/2.

Si noti che qualcuno potrebbe collegare l'uscita del processo a un terminale diverso con ./myscript.sh > /dev/pts/1234. Quindi sarebbe "reindirizzato", ma lo stdout sarebbe ancora un terminale.

Esempi:

$ ls -l /proc/$$/fd/1 > results 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/null 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' |cat 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/pts/0 
$ cat results 
lrwx------ 1 je4d je4d 64 2012-02-17 21:09 /proc/2463/fd/1 -> /dev/pts/11 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8302/fd/1 -> /dev/null 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8304/fd/1 -> pipe:[222798] 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8307/fd/1 -> /dev/pts/0 

[ -t 1 ] sarebbe vero per il 1 ° e 4 ° di quelli.

+2

Questa è una ricca risposta che mi permette di capire alcune cose bash. Grazie ! – Sigmun

+0

Thx! Ho fatto un test da riga di comando, ma non ha funzionato per la mia sorpresa. Questo comando: '(lsof -p $$; ls -l/proc/$$/fd; [-t 1] || echo -n NOT \; echo TERM: $$; ps --forest -s $$;) | cat -' stampa '/ dev/pts/1' per fd 1, ma stampa' NOT TERM'. Quindi [tag: bash] sa che è reindirizzato ('(...)' esegue in un sotto- [tag: bash]), ma $$ è ancora il PID del genitore [tag: bash]. – TrueY

+0

Sì, è proprio quello che fa $$, le sottotitoli non lo influenzano. Ecco perché ho usato bash -c '...' invece. – je4d

Problemi correlati