web-dev-qa-db-fra.com

Comment puis-je vérifier dans bash si un shell s'exécute en mode interactif?

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.

51
Alex B

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
14
user4514

Utilisation:

if tty -s; then echo interactive; fi
12
sorin

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".

6
chris

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

2
Ray Foss