@xenoterracide: au moins unix.stackexchange.com/questions/3645/… . La réponse de geekosaur étant plus complète, j'ai voté en faveur de la fermeture de la question précédente.
Gilles, arrête de faire le mal
1
echo $ SHELL, non?
innocent-world
@ innocent-world Non, ce echo #SHELLn'est pas tout à fait ça. Voir le numéro 3 dans la réponse de geekosaur .
Basil Bourque
Je ne suis pas sûr que "shell" ait un sens bien défini. Par exemple, vous pouvez courir xterm -e /bin/cat mais je ne suis pas content d’appeler /bin/catun shell.
Basile Starynkevitch
De plus, certains shells (comme scsh ) n'utilisent pas le shell POSIX comme la syntaxe.
Basile Starynkevitch
Réponses:
71
Plusieurs manières, du plus au moins fiable (et du plus au moins "lourd"):
ps -p$$ -ocmd=. (Sous Solaris, il se peut que cela doive être à la fnameplace de cmd. Sous OSX et sous BSD, à la commandplace de cmd.)
Vérifiez pour $BASH_VERSION, $ZSH_VERSIONet d'autres variables spécifiques au shell.
Chèque $SHELL; c'est un dernier recours, car il spécifie votre shell par défaut et pas nécessairement le shell actuel .
Je n'aime pas $0parce que c'est plus compliqué: (1) il peut s'agir simplement du nom de base, (2) il peut avoir '-' sur le devant pour le désigner comme un shell de connexion.
geekosaur
ps -p$$ -ocmd=""est plus jolie :-)
asoundmove
1
@geekosaur: peut-être, mais $0semble quand même plus utile que $SHELL: ne êtes-vous pas d'accord? Vous pouvez toujours le faire passer sedpour supprimer le "-".
iconoclaste
2
Si vous courez tcsh, $tcshet $versionsera réglé. Ce sont des variables shell, pas des variables d'environnement. Si vous utilisez une version non-tcsh de csh, je ne pense pas qu'il existe des variables distinctives. Et bien sûr, la syntaxe utilisée pour vérifier les variables diffère entre csh / tcsh d'une part et sh / ksh / bash / zsh de l'autre.
Keith Thompson
41
J'ai constaté que les éléments suivants fonctionnaient dans les quatre interpréteurs installés sur mon système (bash, dash, zsh, csh):
$ ps -p $$
Ce qui suit fonctionne sur zsh, bash et dash, mais pas sur csh:
Je pense que la réponse de @ jiliagre est probablement celle que je voudrais utiliser aujourd'hui. Sur le poisson %selfpeut être utilisé à la place de$$
Steven D
8
Comme la question demande le shell utilisé et ne parle pas des arguments potentiels qui lui sont transmis, voici un moyen d'éviter de les montrer:
Remarque à propos de certaines implémentations plus légères (téléphones Android, busybox, etc.): psne prend pas toujours en charge le -pcommutateur, mais vous pouvez effectuer la recherche avec une commande telle que ps | grep "^$$ ". (Cette grepexpression rationnelle identifiera de manière unique le PID, ainsi il n’y aura pas de faux positifs.)
-hou en terminant toutes les options avec =pour ne montrer aucun en-tête.
-o commpour afficher uniquement le processus nom de base ( bashau lieu de /bin/bash).
-p <PID> liste seulement les processus dont la liste de formulaires PID est fournie.
Utilisation du pseudo système de fichiers d'informations de processus / proc :
cat /proc/$$/comm
Cette option se comporte exactement comme la pscommande ci-dessus.
ou
readlink /proc/$$/exe
Cela /proc/PID/exerenvoie au fichier en cours d’exécution, qui dans ce cas ferait référence à / bin / bash, / bin / ksh, etc.
Pour obtenir uniquement le nom du shell, vous pouvez simplement utiliser
basename $(readlink /proc/$$/exe)
C’est la seule option qui donnera toujours le même résultat, même si vous êtes dans un script, un code source ou un terminal, en tant que liens vers le fichier binaire de l’interpréteur de shell utilisé.
Avertissement Vous devez être conscient que cela montrera le binaire ultime, donc ksh peut être lié à ksh93 ou sh à bash.
L’utilisation de /procest vraiment utile via le /proc/selflien qui relie au PID de la commande en cours.
Cela renverra très probablement le chemin de l'exécutable shell de votre shell de connexion. Il n’est pas certain que le shell de connexion soit celui que vous utilisez actuellement.
Kusalananda
1
Le pid du shell en cours d'exécution est donné par le var $$ (dans la plupart des shells).
Sur OS / X, dans mes tests, je reçois au moins 3 lignes, une pour le shell, une pour /usr/lib/dyld, une pour /private/var/db/dyld/dyld_shared_cache_x86_64.
Stéphane Chazelas
Oui, il ne sélectionne plus que les entrées dans / bin et / usr / bin
Stéphane Chazelas le
@ StéphaneChazelas Peut-être que c'est mieux maintenant?
0
Je mets $MYSHELLde futurs tests dans mon shell agnostique ~/.aliases:
unset MYSHELLif[-n "$ZSH_VERSION"]&& type zstyle >/dev/null 2>&1;then# zsh
MYSHELL=`command -v zsh`elif[-x "$BASH"]&& shopt -q >/dev/null 2>&1;then# bash
MYSHELL=`command -v bash`elif[-x "$shell"]&& which setenv |grep builtin >/dev/null;then# tcsh
echo "DANGER: this script is likely not compatible with C shells!"
sleep 5
setenv MYSHELL "$shell"fi# verifyif[!-x "$MYSHELL"];then
MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`[-x "$MYSHELL"]|| MYSHELL="${SHELL:-/bin/sh}"# default if verify failsfi
La tcshsection est probablement imprudente dans un script de style POSIX car elle est radicalement différente (d'où l'avertissement et une pause de cinq secondes). (D'une part, les cshcoquilles de style ne peuvent pas faire 2>/dev/nullou >&2, comme indiqué dans le fameux discours de Csh Programming Considered Harmful .)
Vous pouvez simplement utiliser la echo $0commande pour vérifier quel shell vous utilisez et <name_of_the_shell> --versionpour vérifier la version du shell. (par exemple. bash --version)
echo #SHELL
n'est pas tout à fait ça. Voir le numéro 3 dans la réponse de geekosaur .xterm -e /bin/cat
mais je ne suis pas content d’appeler/bin/cat
un shell.Réponses:
Plusieurs manières, du plus au moins fiable (et du plus au moins "lourd"):
ps -p$$ -ocmd=
. (Sous Solaris, il se peut que cela doive être à lafname
place decmd
. Sous OSX et sous BSD, à lacommand
place decmd
.)$BASH_VERSION
,$ZSH_VERSION
et d'autres variables spécifiques au shell.$SHELL
; c'est un dernier recours, car il spécifie votre shell par défaut et pas nécessairement le shell actuel .la source
$0
aussi?$0
parce que c'est plus compliqué: (1) il peut s'agir simplement du nom de base, (2) il peut avoir '-' sur le devant pour le désigner comme un shell de connexion.ps -p$$ -ocmd=""
est plus jolie :-)$0
semble quand même plus utile que$SHELL
: ne êtes-vous pas d'accord? Vous pouvez toujours le faire passersed
pour supprimer le "-".tcsh
,$tcsh
et$version
sera réglé. Ce sont des variables shell, pas des variables d'environnement. Si vous utilisez une version non-tcsh decsh
, je ne pense pas qu'il existe des variables distinctives. Et bien sûr, la syntaxe utilisée pour vérifier les variables diffère entre csh / tcsh d'une part et sh / ksh / bash / zsh de l'autre.J'ai constaté que les éléments suivants fonctionnaient dans les quatre interpréteurs installés sur mon système (bash, dash, zsh, csh):
Ce qui suit fonctionne sur zsh, bash et dash, mais pas sur csh:
la source
%self
peut être utilisé à la place de$$
Comme la question demande le shell utilisé et ne parle pas des arguments potentiels qui lui sont transmis, voici un moyen d'éviter de les montrer:
la source
Remarque à propos de certaines implémentations plus légères (téléphones Android, busybox, etc.):
ps
ne prend pas toujours en charge le-p
commutateur, mais vous pouvez effectuer la recherche avec une commande telle queps | grep "^$$ "
. (Cettegrep
expression rationnelle identifiera de manière unique le PID, ainsi il n’y aura pas de faux positifs.)la source
ps | grep $$
peut toujours donner de faux positifs si, par exemple, votre processus actuel est1234
et qu'il existe un processus12345
.Il y a deux manières très simples:
Utilisation de la commande ps :
ou
où:
-h
ou en terminant toutes les options avec=
pour ne montrer aucun en-tête.-o comm
pour afficher uniquement le processus nom de base (bash
au lieu de/bin/bash
).-p <PID>
liste seulement les processus dont la liste de formulaires PID est fournie.Utilisation du pseudo système de fichiers d'informations de processus / proc :
Cette option se comporte exactement comme la
ps
commande ci-dessus.ou
Cela
/proc/PID/exe
renvoie au fichier en cours d’exécution, qui dans ce cas ferait référence à / bin / bash, / bin / ksh, etc.Pour obtenir uniquement le nom du shell, vous pouvez simplement utiliser
C’est la seule option qui donnera toujours le même résultat, même si vous êtes dans un script, un code source ou un terminal, en tant que liens vers le fichier binaire de l’interpréteur de shell utilisé.
Avertissement Vous devez être conscient que cela montrera le binaire ultime, donc ksh peut être lié à ksh93 ou sh à bash.
L’utilisation de
/proc
est vraiment utile via le/proc/self
lien qui relie au PID de la commande en cours.la source
Un mélange de toutes les autres réponses, compatibles avec Mac (comm), Solaris (fname) et Linux (cmd):
la source
csh
ettcsh
ça me donneAmbiguous output redirect.
Si vous l'avez enregistré dans vos variables d'environnement, vous pouvez utiliser les éléments suivants:
la source
Le pid du shell en cours d'exécution est donné par le var $$ (dans la plupart des shells).
Utiliser des backticks pour faire fonctionner jsh (Heirlomm Shell).
Dans beaucoup de coquilles, le test direct des
ps -o args= -p $$
œuvres, maisbusybox ash
échoue sur cela (résolu).La vérification qui
$1
doit être égale à$$
supprime la plupart des faux positifs.Les derniers
;:
servent à garder le shell en marche pour ksh et zsh.Des tests sur plusieurs systèmes vous seront utiles. Veuillez commenter si cela ne fonctionne pas pour vous.
Ne fonctionne pas dans le
csh
type d'obus.la source
/usr/lib/dyld
, une pour/private/var/db/dyld/dyld_shared_cache_x86_64
.Je mets
$MYSHELL
de futurs tests dans mon shell agnostique~/.aliases
:La
tcsh
section est probablement imprudente dans un script de style POSIX car elle est radicalement différente (d'où l'avertissement et une pause de cinq secondes). (D'une part, lescsh
coquilles de style ne peuvent pas faire2>/dev/null
ou>&2
, comme indiqué dans le fameux discours de Csh Programming Considered Harmful .)la source
Vous pouvez simplement utiliser la
echo $0
commande pour vérifier quel shell vous utilisez et<name_of_the_shell> --version
pour vérifier la version du shell. (par exemple.bash --version
)la source
Cela fonctionne aussi:
la source