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, .bashrc
se 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, .bashrc
se 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_profile
ou o ~/.profile
que 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 rc
arquivos de logon , como ~/.bash_profile
ou, ~/.profile
uma vez que isso pode interferir na operação correta do, rsync
por exemplo.
De qualquer forma, ainda é uma boa ideia testar a interatividade, pois pode existir uma configuração incorreta.
[[ $- =~ i ]] && echo interactive
i
~/.bash_profile
ou ~/.profile
estão incorretas, pois isso interfere no comportamento esperado . O que você acha de abastecimento ~/.bashrc
de ~/.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 test
ferramenta 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".