Comment savoir ~/.bashrcsi je cours en mode interactif ou, disons, en exécutant une commande sur ssh. Je veux éviter d’imprimer des séquences d’échappement ANSI .bashrcsi c’est la dernière.
Comment savoir ~/.bashrcsi je cours en mode interactif ou, disons, en exécutant une commande sur ssh. Je veux éviter d’imprimer des séquences d’échappement ANSI .bashrcsi c’est la dernière.
Réponses:
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.
Pour que vous puissiez 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, ~/.bashrcne provient que des coques interactives. Parfois, les personnes le recherchent ~/.bash_profileou ~/.profilece 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é contenant le code commun et le source indépendamment des deux fichiers rc.
Il est préférable de ne pas générer de sortie de rcfichiers de connexion tels que ~/.bash_profileou sur stdout, ~/.profilecar cela pourrait nuire au bon fonctionnement de, rsyncpar exemple.
Dans tous les cas, il est toujours judicieux de tester l'interactivité, car une configuration incorrecte peut exister.
[[ $- =~ i ]] && echo interactive
i
~/.bash_profileou ~/.profilece qui est incorrect car il interfère avec le comportement attendu Right. Que pensez - vous de l' approvisionnement à ~/.bashrcpartir ~/.bash_login? Comme le shell de connexion n'a pas besoin d'être interactif, je suppose que c'est également incorrect.
Utilisation:
if tty -s; then echo interactive; fi
l' testoutil peut vérifier cela (depuis 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
bash <<< 'test -t 0 && echo Y || echo X'écrit Y, bash -c 'test -t 0 && echo Y || echo X'écritX
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 généralement quelque chose comme "pas un tty".
C'est comme ça que Red Hat le fait ... En devinant que c'est le moyen le plus rapide ...
if [ "$-#*i" == "$-" ]; then
Cela signifie obtenir les paramètres bash, effectuer une suppression de sous-chaîne, la plus courte possible, faire correspondre tout ce qui se situe entre le début et i. Puis vérifiez si c'est le même que les paramètres bash d'origine.
Vérifiez que vous avez bien fait votre travail en vous connectant à l'utilisateur à l'aide de sftp. Il échouera si des sessions non interactives sont en sortie.