Question Comment déterminer le shell actuel sur lequel je travaille?


Comment puis-je déterminer le shell actuel sur lequel je travaille?

La sortie de la ps commande seule être suffisante?

Comment cela peut-il être fait dans différentes saveurs d'UNIX?


481
2017-07-24 21:35


origine


Réponses:


  • Il y a 3 approches pour trouver le prénom de l'exécutable du shell actuel:

    S'il vous plaît noter que les 3 approches peuvent être trompés si l'exécutable de la coquille est /bin/sh mais c'est vraiment un rebaptisé bash, par exemple (ce qui arrive souvent).

    Ainsi votre deuxième question de savoir si ps la sortie fera est répondu avec "pas toujours".

    1. echo $0 - va imprimer le nom du programme ... qui dans le cas de shell est le shell réel

    2. ps -ef | grep $$ | grep -v grep  - Cela recherchera l'ID de processus en cours dans la liste des processus en cours. Puisque le processus en cours est shell, il sera inclus.

      Ce n'est pas fiable à 100%, car vous pourriez avoir d'AUTRES processus dont ps La liste inclut le même numéro que l'ID de processus du shell, en particulier si cet ID est un petit # (par exemple si le PID du shell est "5", vous pouvez trouver des processus appelés "java5" ou "perl5" dans le même grep sortie!). C'est le deuxième problème avec l'approche "ps", en plus de ne pas pouvoir s'appuyer sur le nom du shell.

    3. echo $SHELL - Le chemin vers le shell actuel est stocké en tant que SHELL variable pour n'importe quel shell. La mise en garde pour celui-ci est que si vous lancez explicitement un shell en tant que sous-processus (par exemple, ce n'est pas votre shell de connexion), vous obtiendrez la valeur de votre shell de connexion à la place. Si c'est une possibilité, utilisez le ps ou $0 approche.


  • Si, toutefois, l'exécutable ne correspond pas à votre shell réel (par ex. /bin/sh est en fait bash ou ksh), vous avez besoin d'heuristiques. Voici quelques variables environnementales spécifiques aux différentes coques:

    • $version est réglé sur tcsh

    • $BASH est réglé sur bash

    • $shell (minuscules) est défini sur le nom de shell réel dans csh ou tcsh

    • $ZSH_NAME est réglé sur zsh

    • ksh a $PS3 et $PS4 ensemble, alors que Bourne shell normale (sh) a seulement $PS1 et $PS2 ensemble. Cela semble généralement le plus difficile à distinguer - la seule différence dans l'ensemble des variables d'environnement entre sh et ksh nous avons installé sur Solaris boxen est $ERRNO, $FCEDIT, $LINENO, $PPID, $PS3, $PS4, $RANDOM, $SECONDS, $TMOUT.


620
2017-07-24 21:37



ps -p $$

devrait fonctionner partout où les solutions impliquant ps -ef et grep faire (sur toute variante Unix qui prend en charge Options POSIX pour ps) et ne souffrira pas des faux positifs introduits par grepping pour une séquence de chiffres qui peut apparaître ailleurs.


76
2017-07-24 22:09



Essayer

ps -p $$ -oargs=

ou

ps -p $$ -ocomm=

32
2018-06-19 08:59



Tu peux essayer:

ps | grep `echo $$` | awk '{ print $4 }'

Ou:

echo $SHELL

19
2017-07-24 21:38



Si vous voulez juste vous assurer que l'utilisateur appelle le script avec bash:

if [ ! -n "$BASH" ] ;then echo Please run this script $0 with bash; exit 1; fi

19
2018-03-31 16:54



$SHELL n'a pas toujours besoin de montrer le shell actuel. Il reflète uniquement le shell par défaut à appeler.

Pour tester ce qui précède, dites bash est le shell par défaut, essayez echo $SHELL, puis dans le même terminal, entrez dans un autre shell (ksh par exemple) et essayez $SHELL, vous verrez le résultat comme bash dans les deux cas.

Pour obtenir le nom du shell actuel, utilisez cat /proc/$$/cmdline Et le chemin vers le shell exécutable par readlink /proc/$$/exe


10
2017-10-15 11:45



ps est la méthode la plus fiable. L'environnement SHELL n'est pas garanti et même s'il l'est, il peut facilement être usurpé


8
2017-07-24 21:39



J'ai un truc simple pour trouver le shell actuel. Tapez simplement une chaîne aléatoire (qui n'est pas une commande). Il échouera et retournera une erreur "introuvable", mais au début de la ligne, il indiquera quel shell il est:

ksh: aaaaa: not found [No such file or directory]
bash: aaaaa: command not found

8
2017-12-09 15:34