Je pense comprendre les différences entre un shell interactif, un login et un batch. Voir les liens suivants pour plus d'aide:
- Quelle est la différence entre un shell "login" et un shell bash "interactif" (du site partenaire : serverfault.com )
- 2.1: Types de shell: shell interactifs et de connexion (du Guide de l'utilisateur au Z-Shell )
Ma question est, comment puis-je tester avec une commande / condition si je suis sur un shell interactif, un login ou batch?
Je cherche 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
Réponses:
Je suppose un
bash
shell, ou similaire, car il n'y a pas de shell dans les balises.Pour vérifier si vous êtes dans un shell interactif:
Pour vérifier si vous êtes dans un shell de connexion:
Par "batch", je suppose que vous voulez dire "non interactif", le contrôle d'un shell interactif devrait donc suffire.
la source
zsh
utilisateurs, il est possible de rechercher un shell de connexion avec:if [[ -o login ]] ...
$-
est développée dans le shell actuel. Si vous utilisez des guillemets simples autour de l'expression complète, vous obtiendrez le résultat correct:bash -c '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"'
Dans n'importe quel shell de style Bourne, l'
i
option indique si le shell est interactif:Il n'y a pas de moyen portable et totalement fiable de tester un shell de connexion. Ksh et zsh ajoutent
l
à$-
. Bash définit l'login_shell
option avec laquelle vous pouvez interrogershopt -q login_shell
. De manière portable, vérifiez si$0
commence par un-
: shells savent normalement qu'ils sont des shells de connexion, car l'appelant a ajouté un-
préfixe à l'argument zéro (normalement le nom ou le chemin de l'exécutable). Cela ne permet pas de détecter les moyens d’appeler un shell de connexion spécifiques à un shell (par exempleash -l
).la source
$0
on commençait toujours par un-
peu importe comment on avait commencé. Mais il y a au moins une exception: ce n'est pas toujours vrai avec bash même s'il est supposé être un shell de connexion. Essayez-le dans votre boîte: invokebash --login
, puis$0
lit toujoursbash
.coquille de poisson
Voici la réponse
fish
au cas où d'autres utilisateurs tomberaient sur cette page.Documentation poisson: initialisation
la source
csh / tcsh
Pour
csh
ettcsh
j'ai dans mon.cshrc
dossier:Spécifiquement pour
tcsh
, la variableloginsh
est définie pour un shell de connexion:(a
tcsh
également une variableshlvl
qui est définie sur le nombre de shells imbriqués, où le shell de connexion a une valeur de 1.)la source
PS1
ne fonctionne pas pour tester un shell interactif. Il est presque toujours défini comme interactif, mais vous pouvez le désactiver. Il est très souvent situé dans une coquille noninteractive, parce que de nombreux systèmes navire avecexport PS
en/etc/profile
.Une autre façon est de vérifier le résultat de
tty
la source
[ -t 0 ]
pour tester si STDIN est un tty. Vous pouvez également utiliser 1 (STDOUT) ou 2 (STDERR) selon vos besoins.disown
vie,tty
travaillait mieux pour savoir qu'il n'était plus interactif, alors$-
qu'il ne changeait pas; Je suis toujours perplexe quant à la meilleure approche.[ -t 0 ]
. PS Dans mon précédent commentaire, j’écrivais qu’il existait «une forte corrélation», j’avais oublié «à part le cas extrêmement courant d’un script démarré avec#!/bin/sh
ou similaire», qui est non interactif mais peut être connecté à un terminal.UNIX / Linux a une commande pour vérifier si vous êtes sur un terminal.
la source
dash
aussi.Vous pouvez vérifier si stdin est un terminal:
la source
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 la
$PS1
variable:J'ai appris cela ici: https://www.tldp.org/LDP/abs/html/intandnonint.html
la source
i
n'est pas la bonne option à rechercher.-i
consiste à forcer un shell non interactif à devenir interactif. L'option d'activation automatique correcte est-s
, mais Bash ne le gère malheureusement pas correctement.Vous devez vérifier si
$-
contients
(ceci est autorisé à être activé automatiquement) ou s'il contienti
(ceci n'est pas autorisé à être activé automatiquement, mais uniquement couplé à l'-i
option de ligne de commande du shell).la source
s
serait si le shell lit les commandes de stdin, pas si c'est interactif. Un shell interactif ne lit pas nécessairement les commandes de stdin (essayezzsh -i < /dev/null
, bien que zsh semble être l'exception ici). Et un shell peut lire des commandes à partir de stdin et ne pas être interactif (commesh < file
ouecho 'echo "$1"' | sh -s foo bar
).[[...]]
qui implique ksh / bash / zsh. Vous avez un point en tant que note d’historique, à savoir que la vérification dei
dans$-
ne fonctionnera pas dans le shell Bourne. Mais alors vérifiers
ne fonctionnera pas là non plus de manière fiable. Vous voudriez aussi vérifier[ -t 0 ]
oui
; même dans ce cas, on serait dupe dans des dossiers commeecho 'exec < /dev/tty; that-check' | sh'