Pergunta sobre detecção interativa no bash

3

Eu tenho uma pergunta sobre a detecção interativa no bash.

O script a seguir é impresso se for chamado no modo interativo ou não.

$ cat int.sh 
#!/bin/bash

if [ -t 0 ]; then
    echo "interactive"
else
    echo "not interactive"
fi

Alguns exemplos de chamadas ...

$ ./int.sh 
interactive
$ echo toto | ./int.sh
not interactive
$ ./int.sh < ./int.sh
not interactive
$ ./int.sh <<EOF
> hello world!
> EOF
not interactive

Mas por que o resultado é interativo para o caso a seguir?

$ ./int.sh <( cat ./int.sh )
interactive
    
por kitekat75 25.02.2015 / 12:07

1 resposta

3

A declaração <(...) no bash é substituição do processo . O processo em <(...) é executado com sua entrada ou saída conectada a um FIFO ou algum arquivo em /dev/fd . Veja com:

echo <(echo foo)

Ele imprime algo como /dev/fd/63 . Esse é o descritor de arquivos. A parte <(...) é então substituída por esse descritor de arquivo. Então, em sua declaração, a ligação seria, por exemplo:

./int.sh <( cat ./int.sh )

é substituído por:

./int.sh /dev/fd/63

Então, é apenas um argumento para o script ./int.sh , que ainda é chamado de forma interativa.

    
por 25.02.2015 / 13:40