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 $0
dans les deux cas.
Dans le premier cas:
$ echo $0
-bash
Dans le second cas:
$ echo $0
/bin/bash
Pourquoi cette différence?
bash
ubuntu
terminal
gnome-terminal
Code bleu
la source
la source
Réponses:
Si la sortie de la
echo $0
commande est,-bash
cela signifie qu'elle abash
été invoquée en tant que shell de connexion. Si la sortie est seulementbash
, alors vous êtes dans un shell sans connexion.man bash
dit quelque part à la ligne 126:En savoir plus ici: Différence entre le shell de connexion et le shell sans connexion? .
Maintenant, pour expliquer pourquoi vous obtenez
/bin/bash
dans 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$0
en quelque chose d'autre. Comme exemple, voyez ce qui se passe$0
dans mon terminal (le même terminal tout le temps):la source
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,-bash
elle 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 bash
la section INVOCATION.la source
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:sh
survi
, ou lorsque vous créez une nouvelle fenêtre de terminal.À l'origine, le shell lisait
~/.profile
lorsque 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 deargv[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.csh
a été conçu pour lire dans deux scripts d'initialisation différents.~/.login
a été lu uniquement lorsqu'un utilisateur s'est connecté, et le signal pour le faire était siargv[0]
commencé avec'-'
.~/.cshrc
a été lu à chaque démarrage du shell. En général, on a placé des alias~/.cshrc
et 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écuterfortune
.D'autres obus ont adopté ces mêmes caractéristiques.
ksh
lirait~/.kshrc
,bash
lirait~/.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.
la source