web-dev-qa-db-fra.com

Comment vérifier si un shell est connecté / interactif / batch

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
151

Je suppose un shell bash, ou similaire, car aucun shell n'est répertorié dans les balises.

Pour vérifier si vous êtes dans un shell interactif:

[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'

Pour vérifier si vous êtes dans un shell de connexion:

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.

171
Chris Down

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).

coquille de poisson

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"

Documentation poisson: initialisation

24
ohspite

csh/tcsh

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.)

19
Andrew Stein

Une autre façon est de vérifier le résultat de tty

if [ "`tty`" != "not a tty" ]; then
17
Adrian Cornish

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
10
Paul

Vous pouvez vérifier si stdin est un terminal:

if [ -t 0 ]
then
    echo "Hit enter"
    read ans
fi
10
Angelo

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

3
Christian Herenz

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).

2
schily

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.

Référence: http://www.linuxquestions.org/questions/programming-9/how-to-check-in-a-script-whether-the-Shell-is-login-or-non-login- 360629 /

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.

1
jwd