Comment savoir ~/.bashrc
si 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 .bashrc
si c’est la dernière.
Comment savoir ~/.bashrc
si 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 .bashrc
si 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, ~/.bashrc
ne provient que des coques interactives. Parfois, les personnes le recherchent ~/.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é 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 rc
fichiers de connexion tels que ~/.bash_profile
ou sur stdout, ~/.profile
car cela pourrait nuire au bon fonctionnement de, rsync
par exemple.
Dans tous les cas, il est toujours judicieux de tester l'interactivité, car une configuration incorrecte peut exister.
[[ $- =~ i ]] && echo interactive
i
~/.bash_profile
ou ~/.profile
ce qui est incorrect car il interfère avec le comportement attendu Right. Que pensez - vous de l' approvisionnement à ~/.bashrc
partir ~/.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' test
outil 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.