Como posso saber qual dispositivo ou nome de arquivo estou redirecionando para

1

De dentro de um script de shell (sh / bash), como posso saber a qual dispositivo ou nome de arquivo estou redirecionando?

Por exemplo, eu tenho um script de shell chamado script.sh .

Eu corro o shell script e redireciono o STDOUT para um arquivo chamado out.txt , e redireciono o STDERR para um arquivo chamado err.txt .

Então, seria assim:

$ ./script.sh > out.txt 2> err.txt

Agora, de dentro do shell script, eu posso dizer se STDOUT (ou STDERR) está sendo redirecionado, ou não:

if [ -t 1 ]; then...
if [ ! -t 1 ]; then...

mas, uma vez que eu sei que STDOUT (ou STDERR) está sendo redirecionado, como eu posso dizer onde ele está sendo redirecionado para?

    
por Kevin Fegan 09.02.2014 / 05:41

2 respostas

2

Você pode usar lsof :

/usr/sbin/lsof -p $$ -a -d 1

O acima listaria apenas o descritor de arquivo 1 para apenas o processo atual:

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    5054 matt    1u   CHR  136,1      0t0    4 /dev/pts/1
    
por 09.02.2014 / 07:32
1

Você geralmente faz coisas como "assistir" scripts, observando-os do lado de fora ou do script que chamou esse script subordinado.

$ ./script.sh > out.txt 2> err.txt &
[1] 6280

Agora assistimos:

$ watch "ls -l out.txt err.txt"
Every 2.0s: ls -l out.txt err.txt                        Sun Feb  9 00:30:37 2014

-rw-rw-r--. 1 saml saml 0 Feb  9 00:30 err.txt
-rw-rw-r--. 1 saml saml 0 Feb  9 00:30 out.txt

A cada 2 segundos (você pode alterar isso) a saída será atualizada:

Every 2.0s: ls -l out.txt err.txt                        Sun Feb  9 00:30:39 2014

-rw-rw-r--. 1 saml saml 200 Feb  9 00:30 err.txt
-rw-rw-r--. 1 saml saml 200 Feb  9 00:30 out.txt
    
por 09.02.2014 / 06:32