Selon ma connaissance, pour déterminer le shell actuel que nous utilisons echo $0
dans le shell. Je veux plutôt que mon script vérifie dans quel shell il s'exécute. J'ai donc essayé d'imprimer $0
dans le script et il renvoie le nom du script comme il se doit. Donc, ma question est de savoir comment trouver dans quel shell mon script s'exécute pendant l'exécution?
22
echo $0
n'est pas une option ici, car le script s'exécutera sur de nombreuses machines différentes où la première chose que je devrai vérifier est le shell.#! /bin/sh -
en haut, cela fonctionnerash
. Vous voulez dire de quelle variantesh
s'agit-il?Réponses:
Sur Linux, vous pouvez utiliser
/proc/PID/exe
.Exemple:
la source
/bin/sed -r -e 's/\x0.*//' /proc/$$/cmdline
donne zsh ou ksh à la place. (Ce serait 0 $ si les shells ne corrigeaient pas par magie cela pour donner le nom des scripts à la place)./proc
est aussi moche et impossible à transporter que possible./proc
n'est pas «moche»./proc
est souvent une solution très élégante. Unportable oui, mais parce que quelque chose n'est pas transférable ne le rend pas laid./proc
laid parce que les fichiers qu'il contient peuvent aller et venir au gré des développeurs et le contenu des fichiers est susceptible de changer sans préavis, causant une douleur sans fin en raison de Bitrot et du déplacement des formats de fichiers cibles.Peut-être pas ce que vous demandez, mais cela devrait fonctionner dans une certaine mesure pour identifier l'interprète qui l'interprète actuellement pour quelques-uns comme Thompson (osh), Bourne, Bourne-again (bash), Korn (ksh88, ksh93, pdksh, mksh ), zsh, Ordinaire conforme à la politique (chic), Yet Another (yash), rc, akanga, es shells, wish, tclsh, expect, perl, python, ruby, php, JavaScript (nodejs, SpiderMonkey shell and JSPL at least) , MS / Wine cmd.exe, command.com (MSDOS, FreeDOS ...).
J'ai posté la version initiale de ce script which_interpreter vers 2004 sur usenet. Sven Mascheck a un script (probablement plus utile pour vous) appelé Whatshell qui se concentre sur l'identification des obus de type Bourne. Vous pouvez également trouver une version fusionnée de nos deux scripts là .
la source
print
pour être une fonction.bash 3.2.53(1)-release
comme l'interprète qui l'interprète.C'est ce que j'utilise dans mon .profile pour vérifier les différents shells sur les systèmes sur lesquels je travaille. Il ne fait pas de fines distinctions entre ksh88 et ksh93, mais il ne m'a jamais fait défaut.
Notez qu'il ne nécessite pas une seule fourche ou tuyau.
la source
ksh93
have$KSH_VERSION
. Cette variable vient depdksh
et n'a jamais atteint AT&T ksh88.FCEDIT
.posh
(pdksh avec la plupart des fonctionnalités non-POSIX supprimées, vous voudrez probablement l'appeler "sh") n'a pas FCEDIT ni KSH_VERSION mais a PS3 (peut-être pas pour longtemps), bien qu'il soit peu probable que l'un l'ait comme shell de connexion . Notez également que le code ci - dessus ne refléterait pas sibash
ouzsh
sont ensh
mode d'émulation, qui peut être un problème si vous utilisez$PROFILE_SHELL
pour décider si oui ou non pour permettre à ce ou cette fonctionnalité. Voir aussi le Whatshell de Sven Mascheck pour en savoir plus que vous pouvez (ou ne pas vouloir) vérifier.Tu pourrais essayer
qui vous donnera le nom de la commande associée au pid du script.
la source
cmd
encomm
lors de la POSIXification de la réponse.Si la
lsof
commande est disponible sur votre système, vous pouvez obtenir le chemin complet de l'exécutable du shell parent en obtenant le PID parent viaps
et en analysant la sortie delsof -p $ppid
(voir Comment déterminer le shell actuel sur lequel je travaille? ).la source
/
, si j'utilise,NR==4
j'obtiens le chemin vers le parent de shell.sh
ont la$PPID
variable. OnLinux
, vous pouvez utiliserreadlink -f "/proc/$PPID/exe"
.En dehors de la terre Linux ou n'ayant pas accès au système de fichiers / proc ou équivalent, vous pouvez utiliser pstree:
En supposant que vous ayez le pid de
Sur un Mac:
Sur une box Linux:
Le format et le style de la sortie de pstree diffèrent selon votre environnement, mais vous pouvez appliquer la sortie ASCII puis sed / tr / awk / etc. filtrez la sortie pour obtenir le shell qui exécute le script.
Donc, une version de sortie nettoyée (fonctionne pour les exécutions Mac ou Linux OS):
Rendements à la volée:
Et lorsqu'il est exécuté avec un autre shell:
Rendements:
Aucun système de fichiers racine ou spécial requis. Remarque, mon filtrage suppose que le nom binaire du shell se termine par sh et qu'il n'y a pas d'entrées intermédiaires se terminant par sh. Suppose également que vous n'avez pas nommé votre script "sh" ou un motif de grep malheureux qui effacera les informations. :) Il faudra une certaine personnalisation pour votre propre environnement afin d'assurer un degré plus élevé de résistance à toute épreuve.
la source
Vous pouvez utiliser la commande:
pour découvrir le shell à partir du script.
la source
$SHELL
c'est la coque de choix de l'utilisateur. Initialisé à partir du shell de connexion de l'utilisateur. Rien à voir avec le shell en cours d'exécution.