3 votes

Dans Terminal, comment pouvez-vous déterminer quel shell est réellement en cours d'exécution ?

En utilisant Terminal sous OS X 10.11.4, l'initialisation de Terminal ouvre une nouvelle fenêtre dans laquelle s'affiche bash (par défaut). Si je comprends bien, la saisie de echo $SHELL devrait afficher l'interpréteur de commandes auquel ladite commande est soumise. Alors, pourquoi est-ce que j'obtiens cette sortie après être passé de bash a tcsh ?

[<dir>] <username>$ tsch
[<dir>] <username>% echo $SHELL
/bin/bash

0 votes

Essayez echo $0 $SHELL est défini dans votre .profile comme une variable d'environnement.

0 votes

@Allan - echo $0 me donne juste une ligne blanche - il y a des shells non POSIX

5voto

jlliagre Points 391

Sous csh family shells, vous obtiendrez votre shell en cours d'exécution avec cette commande :

% echo $shell

Si csh a été exécuté, directement ou indirectement, à partir d'un shell de la famille Bourne dont la variable SHELL est exportée, ce qui est le cas le plus fréquent, la variable SHELL reste intacte, de sorte que echo $SHELL affichera toujours sa valeur précédente, ce qui pourrait prêter à confusion.

C'est ce qui se passe pour vous, l'un des processus parentaux de votre tcsh session était bash . Si bash est lancé avec le SHELL non définie, elle la définit comme étant le chemin d'accès à la variable bash malgré ce que dit sa documentation. Notez que le lancement d'une nouvelle famille de shells Bourne n'aurait pas non plus modifié la variable SHELL si elle était définie. SHELL n'est certainement pas le moyen d'identifier le shell que vous exécutez, mais simplement de savoir quel est votre shell par défaut dans un environnement POSIX.

Un moyen portable de savoir quel shell est en cours d'exécution serait :

ps -o comm= -p $$

Cependant, cette dernière commande suppose que $$ est réglé sur le PID du processus en cours, ce qui, malheureusement, est le cas de certains shells exotiques comme le fish pause. Il existe une méthode encore plus portable pour contourner ce problème :

env sh -c 'basename $(ps -o comm= -p $(ps -o ppid= -p $$))'

0 votes

C'est vrai : mais, comme je l'ai demandé, pourquoi cela produit-il un résultat ? /bin/bash si j'ai (soi-disant) changé le mode de fonctionnement par défaut. bash à tcsh ?

0 votes

Réponse mise à jour. tcsh ne touche pas le SHELL donc si elle a une valeur lorsque tcsh est lancé, il le reste.

0 votes

Réponse portable affichée, ps -o comm= -p $$ devrait fonctionner quel que soit l'interpréteur de commandes, à condition que ce dernier ait correctement configuré $$ qui tcsh devrait faire.

4voto

yoliho Points 340

Cela dépend du shell dans lequel vous vous exécutez.

S'il s'agit d'un shell de confirmation POSIX, par exemple bash, ash,ash, sh, et certains autres, par exemple csh, tcsh, alors echo $0 retournera le nom du shell

par exemple

~ $ bash
bash-3.2$ echo $0
bash

ou

~ $ ksh
$ echo $0
ksh

Cependant, tous les shells ne sont pas POSIX. Par exemple, j'avais l'habitude d'utiliser le profil shell ipython et maintenant fish

0 votes

Ah, oui : je suis entré echo $0 et j'ai obtenu le résultat attendu : tcsh . Je vais continuer et accepter cette réponse car elle résout l'exemple spécifique que j'ai donné. Ceci étant dit, savez-vous si tcsh (ou n'importe quel interpréteur de commandes d'ailleurs) fonctionne dans une sorte d'état "émulé" lorsque j'utilise la fonction tcsh pour passer du système par défaut bash plutôt que de changer le shell par défaut dans les préférences du Terminal en tcsh (ou un autre shell installé) ?

0 votes

@WatermarkBranding L'exécution de tcsh à partir de la ligne de commande est identique à l'exécution en tant que shell par défaut (à l'exception de l'appel en tant que shell de connexion par Terminal).

0 votes

J'apprécie vraiment votre réponse rapide (et qui a permis de résoudre l'exemple que j'ai donné). Cela dit, en toute équité, la réponse de Jllagre répond plus complètement à la question. Je vais quand même mettre une note plus élevée à votre réponse. Le meilleur.

2voto

mike Points 1801

Une autre façon serait de vérifier à quel TTY votre terminal est attaché et de vérifier quel shell est exécuté sur ce TTY. Ensuite, vous pouvez regarder le PID (Process ID) et le PPID (Parent Process ID) au cas où votre shell a engendré un autre shell comme processus enfant :

MacBook:~$ w
15:16  up 8 days, 16:11, 2 users, load averages: 1.26 1.22 1.24
USER     TTY      FROM              LOGIN@  IDLE WHAT
myuser   console  -                19Apr16 8days -
myuser   s000     -                15:15       - w
MacBook:~$ ps -ef | grep s000
UID   PID  PPID   C STIME   TTY           TIME CMD
    0 23865   293   0  3:15PM ttys000    0:00.14 login -pf myuser /bin/bash
  501 23866 23865   0  3:15PM ttys000    0:00.05 -bash
    0 23992 23866   0  3:16PM ttys000    0:00.01 ps -ef
  501 23993 23866   0  3:16PM ttys000    0:00.00 grep s000
MacBook:~$ 

Dans l'exemple ci-dessus, l'utilisation de l'option w j'ai découvert que l'utilisateur myuser est connecté au console (ignorez celle-ci) et aussi à s000 .

J'ai ensuite couru ps -ef et en regardant simplement les colonnes PID et PPID, je peux voir que login (PID 23865) a exécuté bash (PID 23866, PPID 23865), qui a ensuite lancé deux processus : ps -ef (PID 23992, PPID 23866) et grep s000 (PID 23993 PPID 23866).

Si, pour une raison quelconque, j'ai exécuté tcsh de bash Si j'utilise les commandes ci-dessus, je pourrai toujours voir par quel shell ma commande actuelle est exécutée.

1voto

Michael Zhou Points 167

Lorsque vous démarrez une session de terminal dans OS X, la fonction login l'utilité est appelée.

De la page de manuel :

The login utility enters information into the environment (see environ(7)) specifying the user's home directory (HOME), command inter-
preter (SHELL), search path (PATH), terminal type (TERM) and user name (both LOGNAME and USER).

Some shells may provide a builtin login command which is similar or identical to this utility.  Consult the builtin(1) manual page.

Notez les options utilisées lorsque l'utilitaire est appelé puis lisez la page de manuel :

ps -ef | grep -w [l]ogin

Certaines de ces informations ont été glanées dans votre dossier dans opendirectory.

dscl . -read /Users/your_user_name RecordName UserShell NFSHomeDirectory

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X