Como posso saber (in ~/.bashrc
) se estou executando no modo interativo ou, digamos, executando um comando por ssh. Quero evitar a impressão de sequências de escape ANSI, .bashrc
se for o último.
Responder1
De acordo com man bash
:
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
Também:
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 shells interativos. Às vezes, as pessoas o obtêm de ~/.bash_profile
ou ~/.profile
o que é incorreto, pois interfere no comportamento esperado. Se quiser simplificar a manutenção do código comum, você deve usar um arquivo separado para conter o código comum e originá-lo independentemente de ambos os arquivos rc.
É melhor se não houver saída para stdout de rc
arquivos de login, como ~/.bash_profile
ou, ~/.profile
pois isso pode interferir na operação adequada, rsync
por exemplo.
De qualquer forma, ainda é uma boa ideia testar a interatividade, pois pode haver configuração incorreta.
Responder2
a test
ferramenta pode verificar isso (na página de manual):
-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
Responder3
Usar:
if tty -s; then echo interactive; fi
Responder4
É assim que o Red Hat faz... Acho que é o caminho mais rápido...
if [ "${-#*i}" == "$-" ]; then
Significa obter os parâmetros do bash, fazer uma remoção de substring, o mais curto possível, combinar tudo entre o início e i. Em seguida, verifique se é igual aos parâmetros bash originais.
Verifique se você fez seu trabalho conectando-se ao usuário usando sftp; ele falhará se sessões não interativas tiverem saída