Je cherche un moyen simple et fiable pour obtenir le nom du shell actuel à l'intérieur d'un script ou d'un fichier source ( pas à partir de la ligne de commande). Je m'attendrais à le faire, $(basename "$SHELL")
mais si mon shell de connexion est zsh
et j'ai le code suivant dans some_script.sh
this_shell=$( basename "$SHELL" )
echo "The Shell is $this_shell"
echo "The Shell is $0"
et je l'exécute avec bash some_script.sh
, il répertorie toujours zsh
au lieu de bash
même si l'interpréteur utilisé l'est /bin/bash
. Je ne sais pas pourquoi les concepteurs de shell ont choisi d'afficher le shell par défaut au lieu du shell actuel, mais cela semble être ce avec quoi nous sommes coincés.
Il y a d'autres questions légèrement similaires ( ici et ici ), mais leurs réponses sont insuffisantes à bien des égards.
- Ils supposent souvent que l'utilisateur essaie de comprendre quel shell interactif ils utilisent actuellement, mais c'est fou. Je sais dans quel shell je tape des commandes - j'ai besoin de code qui pourrait être exécuté n'importe où pour pouvoir déterminer dans quel shell il utilise.
- Ils donnent souvent plusieurs choses différentes à essayer - encore une fois comme si vous êtes sur la ligne de commande et pouvez simplement jouer jusqu'à ce que vous appreniez que vous utilisez bash - mais j'ai besoin d'une seule chose qui est fiable dans tous les contextes.
- Ils donnent souvent des choses totalement inutiles à partir de scripts, comme
echo $0
. Cela échoue comme indiqué dans le script ci-dessus. (Oui, cela fonctionne dans une ligne de commande de shell interactive, mais pourquoi ne sauriez-vous jamais quel shell vous utilisez?) - Ils donnent parfois des commandes qui (dans mes tests limités) incluent les informations correctes, comme
ps -p $$
, mais manquent de commandes sed / awk multi-plateformes et compatibles shell pour les diriger pour obtenir uniquement le nom du shell et ignorer les autres informations qui viennent Pour le trajet. - Ils incluent des choses qui ne fonctionneront que sur quelques coques, comme
$BASH_VERSION
et$ZSH_VERSION
. Je veux soutenir autant de coquilles que possible, commefish
,csh
,tcsh
.
Comment détecter de manière fiable et précise un shell actuel ? Je cherche quelque chose qui fonctionnera sur toutes les plateformes, dans les scripts, et pour autant de shells que possible et raisonnable 1 .
MISE À JOUR : Quand j'ai posté cette question, je m'attendais à ce qu'il y ait une installation intégrée dans les obus pour nous donner cette information, ce qui ne semble pas être le cas. Puisqu'il semble inévitable maintenant de s'appuyer sur quelque chose en dehors des coquilles, je devrais préciser que je demande unesolution multiplateforme (qui, bien que sous-entendue par mes objections aux autres réponses ci-dessus, pourrait être facile à manquer si vous ne lisez pas la question attentivement).
Mise à jour 2 Si quelqu'un pense toujours que c'est un double de la question Linux uniquement parce que la réponse de Stéphane n'est pas Linux uniquement, voici les différences entre ce que je demande et ce qu'il a fourni. (Notez que ce qu'il a écrit est ingénieux, et je ne le frappe pas, mais cela ne résout pas mon problème.)
- Je cherche quelque chose de simple et fiable , qui
- peut être ajouté à une définition de script ou la fonction (qui proviendraient par un
.zshrc
ou.bash_profile
ou autre) à la branche. - Vous ne pouvez pas utiliser son script comme un utilitaire externe qui transmet le nom de l'interpréteur au script / fonction appelant, car il sera toujours interprété par l'interpréteur par défaut et le renverra. Cela rend son utilisation difficile ou impossible à mes fins. Si c'est possible, c'est encore très très difficile, et la solution pour le faire fonctionner n'est pas donnée dans la réponse. Il n'a donc pas répondu à ma question, il ne s'agit donc pas d'un doublon.
Si vous voulez voir quelque chose qui va travailler, jetez un oeil à ShellDetective sur GitHub . Cela peut permettre de voir plus facilement les différences entre ce qui est déjà présent sur SE et ce que recherche cette question (et a en fait été écrite afin de répondre aux besoins de cette question, qui n'étaient satisfaits nulle part ailleurs).
(PS si vous ne pouvez pas croire qu'il ya un cas d'utilisation pour cela, imaginez les fonctions qui se sourced dans .zshrc
, .bash_profile
ou en .profile
fonction de ce serveur est utilisé et ce que les coquilles dont il dispose. Ils sont source de sorte qu'ils ont pas de ligne de tralala. Ils sont plus utiles s'ils peuvent fonctionner dans n'importe quel shell, mais parfois ils doivent savoir dans quel shell ils se trouvent pour savoir comment se comporter.)
1 Je ne m'intéresse pas aux "obus" qui ne sont pas des obus au sens traditionnel du terme. Je ne suis pas préoccupé par un obus qu'un gars a écrit pour lui-même. Je ne m'intéresse qu'aux vrais shells qui se produisent réellement dans la nature, et que quelqu'un pourrait éventuellement utiliser lors de la connexion à un serveur sur lequel il ne peut pas simplement installer les shells qu'il souhaite.
sh -c "…"
, puis faites l'essentiel du travail dans la syntaxe du shell POSIX.
fish
et je l'utilise pour exécuter votre script, voulez-vous fish
ou csh
?