OVH Cloud OVH Cloud

shell interactifs

11 réponses
Avatar
Fabrice Mendes
Comment savoir dans un script si on est exécuté dans un shell
interactif ? (Et plus particulièrement bash) Je suppose qu'il y
a une variable qui l'indique mais je ne la trouve pas.

Ma rustine consiste à appeler 'tty' mais c'est un peu lourd et
peut-être pas très fiable. (Il retourne "not a tty" ou
N'est pas un « tty » dans un shell non interactif en fct de LC_LANG).
Bref c'est pas très propre tout ça.

FM

10 réponses

1 2
Avatar
Jean-Marc Bourguet
Fabrice Mendes writes:

Comment savoir dans un script si on est exécuté dans un shell
interactif ? (Et plus particulièrement bash) Je suppose qu'il y
a une variable qui l'indique mais je ne la trouve pas.

Ma rustine consiste à appeler 'tty' mais c'est un peu lourd et
peut-être pas très fiable. (Il retourne "not a tty" ou
N'est pas un « tty » dans un shell non interactif en fct de LC_LANG).
Bref c'est pas très propre tout ça.


Pour savoir si un file descriptor correspond a un terminal, test -t.

J'aimerais savoir ce que tu entends par "on est exécuté dans un shell
interactif". Est-ce que ton script est execute (auquel cas le shell
qui l'execute n'est pas un shell interactif) ou source.

Si c'est le premier cas, est-ce que quelque chose execute via un autre
programme (:! dans vi par exemple) est "exécuté dans un shell
interactif", est-ce que quelque chose execute avec tous les fd
standard redirige l'est?

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Stephane Chazelas
2003/10/31, 13:50(+01), Fabrice Mendes:

Comment savoir dans un script si on est exécuté dans un shell
interactif ? (Et plus particulièrement bash) Je suppose qu'il y
a une variable qui l'indique mais je ne la trouve pas.


Il y a $- qui contient une indication de si un shell est
interactif mais ce n'est pas ça qu'il te faut, un script est
toujours interprêté par un shell non-intéractif, meme s'il a été
lancé par un shell intéractif, ça n'a rien à voir.

Ce que tu veux savoir, c'est si l'entrée standard est un tty.

Ma rustine consiste à appeler 'tty' mais c'est un peu lourd et
peut-être pas très fiable. (Il retourne "not a tty" ou
N'est pas un « tty » dans un shell non interactif en fct de LC_LANG).
Bref c'est pas très propre tout ça.


Base-toi sur l'exit status de tty :

if tty > /dev/null 2>&1; then
# c'est un tty
fi

ou utilise le prédicat "-t" de test:

if [ -t 0 ]; then
# c'est un tty
fi

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Fabrice Mendes
Merci pour test -t c'est exactement ce qu'il me faut !
J'ai un .bashrc un peu (trop) customisé (tuné avec des jantes alu)
et lorsque j'utilise scp (ssh) la commande par en vrac après la
connexion avec l'hôte (qui héberge mon .bashrc).

Merci
FM.
Avatar
Pascal Bourguignon
Fabrice Mendes writes:

Comment savoir dans un script si on est exécuté dans un shell
interactif ? (Et plus particulièrement bash) Je suppose qu'il y
a une variable qui l'indique mais je ne la trouve pas.

Ma rustine consiste à appeler 'tty' mais c'est un peu lourd et
peut-être pas très fiable. (Il retourne "not a tty" ou
N'est pas un « tty » dans un shell non interactif en fct de LC_LANG).
Bref c'est pas très propre tout ça.

FM


Franchement, tu exagère!

man bash

An interactive shell is one started without non-option arguments
and without the -c option whose standard input and output are
both connected to terminals (as determined by isatty(3)), or one
started with the -i option. PS1 is set and $- includes i if bash
is interactive, allowing a shell script or a startup file to test
this state.

case "$-" in
*i*) interactive=1 ;;
*) interactive=0 ;;
esac


--
__Pascal_Bourguignon__
http://www.informatimago.com/

Avatar
Stephane Chazelas
2003/10/31, 14:40(+01), Fabrice Mendes:
Merci pour test -t c'est exactement ce qu'il me faut !
J'ai un .bashrc un peu (trop) customisé (tuné avec des jantes alu)
et lorsque j'utilise scp (ssh) la commande par en vrac après la
connexion avec l'hôte (qui héberge mon .bashrc).


En principe, le .bashrc n'est lu que par les shells interactifs,
un shell n'est pas intéractif quand l'entree standard n'est pas
un terminal (sauf si tu passes l'option -i, mais je ne vois pas
trop pourquoi bash serait lancé avec l'option -i). Donc, un test
de [ -t 0 ] dans un .bashrc est toujours censé renvoyer "vrai".

Ah, j'y suis, tu as un:

. ~/.bashrc
dans to ~/.bash_profile, c'est ça?

Et ssh invoque un shell de login pour que les variables
d'environnement que tu utilises d'habitude dans tes sessions
soient positionnées.

C'est vrai que bash a une gestion de ses fichiers de démarrage
complètement incohérente.

Dans le ~/.bash_profile, tu devrais mettre :

[[ "$-" = *i* && -f ~/.bashrc && -r ~/.bashrc ]] && . ~/.bashrc
au lieu de
. ~/.bashrc
tout court ou utiliser un autre shell.

En principe, le ~/.bashrc, c'est le fichier de customisation du
shell, de son utilisation en mode interactif.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Fabrice Mendes
Pascal Bourguignon writes:
Fabrice Mendes writes:
[...] savoir quand un shell est "interactif"


Franchement, tu exagère!
man bash


Mea culpa. J'ai oublié les bases, je me suis rué sur la doc info aux
sections bash features...

$- est expliqué comme suit :
`-'
(A hyphen.) Expands to the current option flags as specified upon
invocation, by the `set' builtin command, or those set by the
shell itself (such as the `-i' option).


Et pour trouver ta citation j'ai du me faire violence dans le man.
Mais si j'avais commencé par le début je ne passerais pas pour un couillon.

Cordialement,
FM

Avatar
Fabrice Mendes
Stephane Chazelas writes:

[...]
Ah, j'y suis, tu as un:

. ~/.bashrc
dans to ~/.bash_profile, c'est ça?


Exact.

Dans le ~/.bash_profile, tu devrais mettre :
[[ "$-" = *i* && -f ~/.bashrc && -r ~/.bashrc ]] && . ~/.bashrc


Il est clair que ce n'est pas très cohérent..,
(Euh le -f est implicitement fait par le -r)

tout court ou utiliser un autre shell.


C'est un peu expéditif... après tant d'années de bons et loyaux services...
Et pis c'est le seul dont je sois sur qu'il est installé partout ici. (oui oui
c'est une excuse un peu faible).

Merci de tous ces éclaircissements.

FM

Avatar
Stephane Chazelas
2003/10/31, 17:30(+01), Fabrice Mendes:
[...]
[[ "$-" = *i* && -f ~/.bashrc && -r ~/.bashrc ]] && . ~/.bashrc


Il est clair que ce n'est pas très cohérent..,
(Euh le -f est implicitement fait par le -r)


Non, "-f" teste si le fichier est un "regular file", "-r", s'il
est lisible.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]


Avatar
Stephane Chazelas
2003/10/31, 18:20(+01), Stephane Chazelas:
[...]
Non, "-f" teste si le fichier est un "regular file" [...]


ou un symlink vers un "regular file".

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Pascal Bourguignon
Fabrice Mendes writes:

Pascal Bourguignon writes:
Fabrice Mendes writes:
[...] savoir quand un shell est "interactif"


Franchement, tu exagère!
man bash


Mea culpa. J'ai oublié les bases, je me suis rué sur la doc info aux
sections bash features...

$- est expliqué comme suit :
`-'
(A hyphen.) Expands to the current option flags as specified upon
invocation, by the `set' builtin command, or those set by the
shell itself (such as the `-i' option).


Et pour trouver ta citation j'ai du me faire violence dans le man.
Mais si j'avais commencé par le début je ne passerais pas pour un couillon.


Oui, c'est là qu'on voit l'avantage d'utiliser emacs pour lire les
pages man: on peut trés facilement faire des recherches et sauter
n'importe où.

Sinon, si on ne veut pas utiliser emacs, c'est plus compliqué, mais on
peut encore faire:

man bash | col -b > /tmp/bash.man ; $VISUAL /tmp/bash.man

pour utiliser son éditeur préféré, mais c'est quand même plus facile de taper:

M-x man RET bash RET

dans emacs...


--
__Pascal_Bourguignon__
http://www.informatimago.com/


1 2