Pourquoi 'echo $ 0' donne un résultat différent pour deux terminaux différents?

15

J'ai ouvert un terminal sur Ubuntu en utilisant Ctrl+ Alt+ Tet un autre terminal en allant dans un répertoire puis en faisant un clic droit et en choisissant "Ouvrir dans le terminal".

J'ai fait un echo $0dans les deux cas.

Dans le premier cas:

$ echo $0
-bash

Dans le second cas:

$ echo $0
/bin/bash

Pourquoi cette différence?

Code bleu
la source
$ 0 renvoie le nom du processus en cours d'exécution.
Ramesh
Exécutez-vous deux terminaux avec un utilisateur différent?
cuonglm
J'utilise le même utilisateur
CodeBlue
3
question similaire askubuntu.com/questions/368509/why-is-0-set-to-bash
Avinash Raj
S'agit-il en fait d'émulateurs de terminal différents ou simplement de deux instances du même émulateur de terminal? Sont-ils tous les deux le terminal par défaut?
terdon

Réponses:

16

Si la sortie de la echo $0commande est, -bashcela signifie qu'elle a bashété invoquée en tant que shell de connexion. Si la sortie est seulement bash, alors vous êtes dans un shell sans connexion.

man bash dit quelque part à la ligne 126:

A  login shell is one whose first character of argument zero is a -, or 
one started with the --login option.

En savoir plus ici: Différence entre le shell de connexion et le shell sans connexion? .

Maintenant, pour expliquer pourquoi vous obtenez /bin/bashdans le deuxième cas, je peux dire qu'un programme (dans votre cas, votre gestionnaire de fichiers, probablement nautilus) ou un script peut changer le sien $0en quelque chose d'autre. Comme exemple, voyez ce qui se passe $0dans mon terminal (le même terminal tout le temps):

entrez la description de l'image ici

Radu Rădeanu
la source
12

La différence tient à la façon dont ceux-ci ont commencé. bash s'initialisera différemment (lira différents scripts de démarrage) selon son argument argv [0]. Si la chaîne commence par un tiret -comme dans, -bashelle s'exécute comme un shell de connexion, sinon, elle s'exécute comme un shell interactif. Il peut également fonctionner comme un shell non interactif (c'est-à-dire dans un script shell).

Pour en savoir plus, il est préférable de lire le manuel, man bashla section INVOCATION.

X Tian
la source
9

Un shell est démarré lorsque vous vous connectez, mais il est également démarré par des programmes comme make, ou lorsque vous exécutez un script shell, ou lorsque vous tapez :shsur vi, ou lorsque vous créez une nouvelle fenêtre de terminal.

À l'origine, le shell lisait ~/.profilelorsque vous vous êtes connecté ou que vous avez exécuté su. Ce script ferait des choses comme annoncer si vous aviez de nouveaux e-mails, personnaliser vos caractères d'effacement et de suppression, et définir et exporter les variables TERM et PATH. Lorsqu'il a démarré dans presque n'importe quel autre contexte, le shell n'a pas lu ~/.profile, car faire la plupart de ces choses serait redondant. Vous deviez avoir exporté toutes les variables importantes du shell vers le nouveau shell.

La façon dont le shell savait s'il fallait lire ~/.profileétait de vérifier si le premier caractère de argv[0], alias $0, l'était '-'.

Tout d'abord csh, des alias ont été introduits. Les alias n'ont pas été exportés dans l'environnement. csha été conçu pour lire dans deux scripts d'initialisation différents. ~/.logina été lu uniquement lorsqu'un utilisateur s'est connecté, et le signal pour le faire était si argv[0]commencé avec '-'. ~/.cshrca été lu à chaque démarrage du shell. En général, on a placé des alias ~/.cshrcet tout le reste ~/.login. cshégalement pris en charge ~/.logout, qui dans la plupart des cas vient d'effacer l'écran et de s'exécuter fortune.

D'autres obus ont adopté ces mêmes caractéristiques. kshlirait ~/.kshrc, bashlirait ~/.bashrc, et c'est là que vous placeriez vos définitions d'alias.

Donc, pour faire court, l'application qui génère un shell doit décider s'il doit s'agir d'un "shell de connexion", auquel cas il y en a '-'au début ou d'un shell normal. Dans la plupart des cas, un shell qui va être interactif est démarré en tant que shell de connexion, et un shell destiné uniquement à exécuter certaines commandes, soit en tant qu'arguments soit à partir d'un script, puis exit est un shell normal.

Mais tout dépend du caprice de l'application qui démarre le shell.

Mark Plotnick
la source