79 votes

Comment vérifier dans bash si un Shell s'exécute en mode interactif ?

Comment puis-je savoir (en ~/.bashrc ) si je fonctionne en mode interactif ou, par exemple, si j'exécute une commande via ssh. Je veux éviter l'impression des séquences d'échappement ANSI dans les messages suivants .bashrc si c'est le dernier.

94voto

jason saldo Points 5036

Selon man bash :

PS1 est défini et $- inclut i si bash est interactif, ce qui permet à un Shell Shell ou un fichier de démarrage de tester cet état.

Donc vous pouvez utiliser :

if [[ $- == *i* ]]
then
    do_interactive_stuff
fi

Aussi :

Lorsqu'un Shell interactif qui n'est pas un Shell de connexion est lancé, bash lit et exécute les commandes à partir de /etc/bash.bashrc et ~/.bashrc, si ces fichiers existent.

Así que ~/.bashrc n'a de source que pour les shells interactifs. Parfois, les gens l'utilisent à partir de ~/.bash_profile o ~/.profile ce qui est incorrect car cela interfère avec le comportement attendu. Si vous voulez simplifier la maintenance du code qui est commun, vous devriez utiliser un fichier séparé pour contenir le code commun et le sourcer indépendamment des deux fichiers rc.

C'est mieux s'il n'y a pas de sortie sur stdout à partir de la connexion. rc des fichiers tels que ~/.bash_profile o ~/.profile car il peut interférer avec le bon fonctionnement de rsync par exemple.

Quoi qu'il en soit, il est toujours bon de tester l'interactivité, car une configuration incorrecte peut exister.

39voto

user4514 Points 403

Le site test peut le vérifier (à 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

15voto

user712092 Points 351

Utilisez :

if tty -s; then echo interactive; fi

6voto

Dave Points 864

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 dira typiquement quelque chose comme "not a tty".

4voto

Ray Foss Points 239

C'est comme ça que Red Hat le fait... Je suppose que c'est le moyen le plus rapide...

if [ "${-#*i}" == "$-" ]; then

Cela signifie que l'on récupère les paramètres bash, que l'on supprime une sous-chaîne, la plus courte possible, en faisant correspondre tout ce qui se trouve entre le début et i. Ensuite, on vérifie si c'est la même chose que les paramètres bash originaux.

Vérifiez que vous avez fait votre travail en vous connectant à l'utilisateur à l'aide de sftp, il échouera si des sessions non interactives ont une sortie.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X