Comment savoir (dans ~/.bashrc
) si j'exécute en mode interactif, ou, disons, que j'exécute une commande sur ssh. Je souhaite éviter l'impression de séquences d'échappement ANSI dans .bashrc
si c'est le dernier.
Selon man bash
:
PS1 est défini et $ - inclut i si bash est interactif, permettant à un script Shell ou à un fichier de démarrage de tester cet état.
Vous pouvez donc utiliser:
if [[ $- == *i* ]]
then
do_interactive_stuff
fi
Aussi:
Lorsqu'un shell interactif qui n'est pas un shell de connexion est démarré, bash lit et exécute les commandes de /etc/bash.bashrc et ~/.bashrc, si ces fichiers existent.
Donc ~/.bashrc
ne provient que des shells interactifs. Parfois, les gens l'approvisionnent auprès de ~/.bash_profile
ou ~/.profile
ce qui est incorrect car il interfère avec le comportement attendu. Si vous souhaitez simplifier la maintenance du code courant, vous devez utiliser un fichier séparé pour contenir le code commun et le source indépendamment des deux fichiers rc.
Il est préférable qu'il n'y ait pas de sortie vers la sortie standard des fichiers de connexion rc
tels que ~/.bash_profile
ou ~/.profile
car il peut interférer avec le bon fonctionnement de rsync
par exemple.
Dans tous les cas, c'est toujours une bonne idée de tester l'interactivité car une configuration incorrecte peut exister.
l'outil test
peut vérifier cela (à partir de la page de manuel):
-t FD True if FD is opened on a terminal.
Vous pouvez donc utiliser par exemple:
if [ -t 0 ] ; then
echo stdin is a terminal
.....
fi
ou
if [ -t 1 ] ; then
echo stdout is a terminal
fi
Utilisation:
if tty -s; then echo interactive; fi
Je regarde généralement la sortie du programme tty.
Si vous êtes sur un tty, il vous dira sur quel tty vous êtes. Si vous n'êtes pas en mode interactif, il vous indiquera généralement quelque chose comme "pas un tty".
C'est comme ça que Red Hat le fait ... Je suppose que c'est le moyen le plus rapide ...
if [ "$-#*i" == "$-" ]; then
Cela signifie obtenir les paramètres bash, faire une suppression de sous-chaîne, le plus court possible, faire correspondre tout entre le début et i. Vérifiez ensuite si ce sont les mêmes que les paramètres bash d'origine.
Vérifiez que vous avez fait votre travail en vous connectant à l'utilisateur à l'aide de sftp, cela échouera si des sessions non interactives ont une sortie