Je suis connecté à un shell distant et de nombreuses clés ne fonctionnent pas correctement, telles que les flèches et la touche d'échappement. Cette réponse Les touches fléchées, l'onglet complet ne fonctionne pas m'a suggéré de me trouver dans le mauvais shell, j'ai donc fait référence à Comment déterminer le shell sur lequel je travaille actuellement? . En utilisant les méthodes décrites, j'obtiens des résultats étranges.
echo $Shell
/bin/bash
mais
echo $0
sh
Quelle coque est-ce que j'utilise?
En cas de doute, utilisez le système de fichiers /proc
. Il y a des dossiers pour chaque processus, avec le fichier comm
, où la commande de ce processus est décrite. Donc, connaissant le PID de Shell, nous pouvons savoir ce que c'est.
$ echo $$
4824
$ cat /proc/4824/comm
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash
Il existe également d'autres fichiers que vous pouvez référencer pour extraire ces mêmes informations:
Cela peut ne pas fonctionner sur anciens noyaux ou sur des systèmes qui ne prennent pas en charge le système de fichiers /proc
(Mac OS X, par exemple).
La commande ps
a le drapeau -p
qui vous permet de spécifier le pid. Nous utilisons toujours la même idée de référencer la variable $$
pour cela.
$ ps -p $$
PID TTY TIME CMD
7728 pts/5 00:00:00 mksh
$ bash
xieerqi@eagle:~$ ps -p $$
PID TTY TIME CMD
7776 pts/5 00:00:00 bash
$0
vs $Shell
.Selon Arch Wiki ,
Shell contient le chemin d'accès à l'utilisateur shell préféré . Notez que ce n’est pas nécessairement le shell en cours d’exécution, bien que Bash définisse cette variable au démarrage.
En d'autres termes, il s'agit du shell interactif par défaut des utilisateurs, identique à celui défini dans /etc/passwd
. C'est aussi la raison pour laquelle la variable $ Shell ne change pas pour les sous-coquilles . Par exemple, quel que soit le nombre de coquilles que je génère, la variable $Shell
est inchangée:
$ echo $Shell
/bin/mksh
$ bash --posix
bash-4.3$ echo $Shell
/bin/mksh
bash-4.3$ dash
$ echo $Shell
/bin/mksh
L'argument $0
affichera le "self" - la commande avec laquelle un programme ou le nom du fichier. Donc, un script simple comme celui-ci:
#!/bin/bash
echo $0
Donnera une sortie comme ceci:
$ ./test_script.sh
./test_script.sh
Ceci est également évident lorsque vous faites quelque chose comme ceci:
$ echo 'one two three' | xargs bash -c 'echo $0'
one
Pour tous les shells, l'option -c
place le premier argument de ligne de commande dans la variable $0
.
En ce qui concerne Shell interactif, 0 $ serait généralement suffisant, mais comme vous pouvez le constater, ce n'est pas un moyen fiable de savoir quel Shell vous utilisez. Savoir que le processus est beaucoup plus fiable
Vous utilisez sh
. Parce que $Shell
fait référence au shell de connexion, et non à celui utilisé actuellement.
Votre fourni lien de question StackOverflow a la bonne méthode pour déterminer correctement le shell en cours d’exécution.
Si le système d'exploitation distant est Ubuntu (ou une autre distribution basée sur GNU/Linux), un moyen très simple de déterminer le shell que vous utilisez est d'exécuter cette commande:
ls -l /proc/$$/exe
si le système d'exploitation distant est pas Ubuntu ou au moins une distribution GNU/Linux similaire, vous avez demandé à un mauvais site.
Si, pour une raison quelconque, le système d'exploitation distant est manquant /proc
(par exemple, une version allégée, incomplète ou ancienne d'Ubuntu, ou peut-être une instance de système d'exploitation conteneurisée), la commande mentionnée ci-dessus ne fonctionnera pas.
Rechercher dans $0
vous donnera un indice indiquant qu'il n'est pas fiable à 100%. Tout programme peut simuler son nom à autre chose. Dans tous les cas, il est très peu probable que vous exécutiez vraiment sh
(le vrai Bourne Shell) car il n’est presque jamais installé sur Linux, il se peut que vous exécutiez un clone sh
, probablement dash
. .
vous semblez utiliser actuellement sh. Pour basculer vers bash, vous pouvez simplement taper "bash"
Il y a déjà beaucoup de bonnes réponses, mais vous pouvez aussi essayer de publier echo $BASH_VERSION
. Si cela affiche un numéro de version, vous êtes en bash. Si elle affiche une ligne vide, vous êtes dans un autre shell.