Como posso saber (in ~/.bashrc) se estou executando no modo interativo ou, digamos, executando um comando sobre ssh. Quero evitar a impressão de seqüências de escape ANSI, .bashrcse for a última.
Como posso saber (in ~/.bashrc) se estou executando no modo interativo ou, digamos, executando um comando sobre ssh. Quero evitar a impressão de seqüências de escape ANSI, .bashrcse for a última.
Respostas:
De acordo com man bash:
O PS1 está definido e $ - inclui i se o bash for interativo, permitindo que um script de shell ou um arquivo de inicialização teste esse estado.
Então você pode usar:
if [[ $- == *i* ]]
then
do_interactive_stuff
fi
Além disso:
Quando um shell interativo que não é um shell de login é iniciado, o bash lê e executa comandos de /etc/bash.bashrc e ~ / .bashrc, se esses arquivos existirem.
Portanto, ~/.bashrcé fornecido apenas para conchas interativas. Às vezes, as pessoas o extraem ~/.bash_profileou o ~/.profileque está incorreto, pois interfere no comportamento esperado. Se você deseja simplificar a manutenção de código comum, use um arquivo separado para conter o código comum e origine-o independentemente dos dois arquivos rc.
É melhor se não houver saída para stdout a partir de rcarquivos de logon , como ~/.bash_profileou, ~/.profileuma vez que isso pode interferir na operação correta do, rsyncpor exemplo.
De qualquer forma, ainda é uma boa ideia testar a interatividade, pois pode existir uma configuração incorreta.
[[ $- =~ i ]] && echo interactive
i
~/.bash_profileou ~/.profileestão incorretas, pois isso interfere no comportamento esperado . O que você acha de abastecimento ~/.bashrcde ~/.bash_login? Como o shell de login não precisa ser interativo, acho que também está incorreto.
Usar:
if tty -s; then echo interactive; fi
a testferramenta pode verificar isso (a partir da página man):
-t FD True if FD is opened on a terminal.
Então você pode usar, por exemplo:
if [ -t 0 ] ; then
echo stdin is a terminal
.....
fi
ou
if [ -t 1 ] ; then
echo stdout is a terminal
fi
bash <<< 'test -t 0 && echo Y || echo X'escreve Y, bash -c 'test -t 0 && echo Y || echo X'escreveX
Eu normalmente olho para a saída do programa tty.
Se você estiver em um tty, ele informará em que tty você está. Se você não estiver no modo interativo, normalmente será exibido algo como "não é um tty".