Vorrei testare nel mio script bash dove sono diretti stdout e stderr o, più precisamente, se sono stati reindirizzati.Test reindirizzamento stderr e stderr in script bash
Hai un'idea?
La variabile bash $*
non mi fornisce queste informazioni.
Vorrei testare nel mio script bash dove sono diretti stdout e stderr o, più precisamente, se sono stati reindirizzati.Test reindirizzamento stderr e stderr in script bash
Hai un'idea?
La variabile bash $*
non mi fornisce queste informazioni.
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
.
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.
Questa è una ricca risposta che mi permette di capire alcune cose bash. Grazie ! – Sigmun
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
Sì, è proprio quello che fa $$, le sottotitoli non lo influenzano. Ecco perché ho usato bash -c '...' invece. – je4d
funziona come volevo! Grazie mille – Sigmun