web-dev-qa-db-fra.com

Est-ce que j'utilise bash ou sh?

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?

7
Info5ek

Utilisez proc filesystem pour connaître le nom du processus de Shell

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:

  • / proc/$$/stat
  • / proc/$$/status
  • / proc/$$/cmdline
  • / proc/$$/exe (lien symbolique vers l'exécutable lui-même)

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).

Variation sur la même approche avec la commande ps

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

10
Sergiy Kolodyazhnyy

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.

10
Anwar

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. .

4
jlliagre

vous semblez utiliser actuellement sh. Pour basculer vers bash, vous pouvez simplement taper "bash"

2
Edgy1

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.

1
Zoltan