Je pense que je comprends les différences entre un shell interactif, un login et un batch. Voir les liens suivants pour plus d'aide:
Ma question est, comment puis-je tester avec une commande/condition si je suis sur un shell interactif, un login ou un batch?
Je recherche une commande ou une condition (qui renvoie true
ou false
) et que je pourrais également placer sur une instruction if. Par exemple:
if [[ condition ]]
echo "This is a login Shell"
fi
Je suppose un shell bash
, ou similaire, car aucun shell n'est répertorié dans les balises.
[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'
shopt -q login_Shell && echo 'Login Shell' || echo 'Not login Shell'
Par "lot", je suppose que vous voulez dire "non interactif", donc la vérification d'un shell interactif devrait suffire.
Dans tout shell de style Bourne, l'option i
indique si le shell est interactif:
case $- in
*i*) echo "This Shell is interactive";;
*) echo "This is a script";;
esac
Il n'existe aucun moyen portable et entièrement fiable de tester un shell de connexion. Ksh et zsh ajoutent l
à $-
. Bash définit le login_Shell
option, que vous pouvez interroger avec shopt -q login_Shell
. Portablement, testez si $0
commence par un -
: les shells savent normalement qu'il s'agit de shells de connexion car l'appelant a ajouté un -
préfixe de l'argument zéro (normalement le nom ou le chemin de l'exécutable). Cela ne parvient pas à détecter les moyens spécifiques à Shell d'invoquer un shell de connexion (par exemple ash -l
).
Voici la réponse pour fish
au cas où d'autres utilisateurs tomberaient sur cette page.
if status --is-interactive
# ...
end
if status --is-login
# ...
end
echo "darn, I really wanted to have to use globs or at least a case statement"
Pour csh
et tcsh
j'ai les éléments suivants dans mon .cshrc
fichier:
if($?prompt) then # Only interactive shells set $Prompt
...
endif
Spécifiquement pour tcsh
, la variable loginsh
est définie pour un shell de connexion:
if($?loginsh) then # A login Shell..
...
endif
(tcsh
a également une variable shlvl
qui est définie sur le nombre de shells imbriqués, où le shell de connexion a une valeur de 1.)
Une autre façon est de vérifier le résultat de tty
if [ "`tty`" != "not a tty" ]; then
UNIX/Linux a une commande pour vérifier si vous êtes sur un terminal.
if tty -s
then
echo Terminal
else
echo Not on a terminal
fi
Vous pouvez vérifier si stdin est un terminal:
if [ -t 0 ]
then
echo "Hit enter"
read ans
fi
Pour vérifier si un script s'exécute dans un shell interactif ou non interactif, je vérifie dans mes scripts la présence d'une invite stockée dans le $PS1
variable:
if [ -z $PS1 ] # no prompt?
### if [ -v PS1 ] # On Bash 4.2+ ...
then
# non-interactive
...
else
# interactive
...
fi
J'ai appris cela ici: https://www.tldp.org/LDP/abs/html/intandnonint.html
i
n'est pas la bonne option à rechercher. -i
est de forcer un shell autrement non interactif à devenir interactif. L'option d'auto-activation correcte est -s
, mais Bash ne gère malheureusement pas cela correctement.
Vous devez vérifier si $-
contient s
(il est autorisé à être activé automatiquement) ou s'il contient i
(il n'est pas autorisé à être activé automatiquement, mais officiellement couplé uniquement au -i
option de ligne de commande du Shell).
Jetez un œil à la commande shopt
(au moins pour Bash). Cela peut certainement vous dire si vous êtes dans un shell de connexion. Je ne connais pas interactif/batch.
Regardez dans la page de manuel de Bash pour plus d'informations: http://linux.die.net/man/1/bash
Remarque: je vous donne Bash, car c'est ce que je sais. Vraisemblablement, d'autres obus ont des fonctionnalités similaires.