Tiret (-) devant bash

14

Si j'examine mon shell bash dans un terminal OS X (10.6.4), par exemple en tapant echo $0, il y a un tableau de bord en face de ma coquille, comme ceci: -bash. Que signifie ce tiret?

marshall.ward
la source

Réponses:

14

Cela signifie qu'il bashest invoqué en tant que shell de connexion.


man bash dit:

Un shell de connexion est un shell dont le premier caractère de l'argument zéro est un -, ou un commençant par l' --loginoption.

Lorsque bash est appelé en tant que shell de connexion interactif ou en tant que shell non interactif avec l' --loginoption, il lit et exécute d'abord les commandes du fichier /etc/profile, si ce fichier existe. Après avoir lu ce fichier, il recherche ~/.bash_profile, ~/.bash_loginet ~/.profile, dans cet ordre, et lit et exécute les commandes de la première qui existe et est lisible. L' --noprofileoption peut être utilisée lorsque le shell est démarré pour inhiber ce comportement.

Lorsqu'un shell de connexion se ferme, bash lit et exécute les commandes du fichier ~/.bash_logout, s'il existe.


Vous trouverez login -pfdans votre pssortie, qui démarre un shell de connexion par défaut.

Essayez de courir login -pfet login -pflvoyez la différence. man logindécrit la différence:

-lIndique au programme exécuté par login qu'il ne s'agit pas d'une session de connexion (par convention, une session de connexion est signalée au programme avec un trait d'union comme premier caractère de argv[0]; cette option le désactive), et l'empêche d' chdir(2)entrer dans le répertoire personnel de l'utilisateur . La valeur par défaut est d'ajouter le trait d'union (il s'agit d'une session de connexion).

Daniel Beck
la source
Grande réponse, merci pour l'explication et les mancitations
marshall.ward
1
J'utilise ubuntu, et je vois différents comportements de echo $0: si je tape echo $0dans le terminal invoqué par ctrl + alt + f1, le résultat est -bash; mais si je le tape dans termianl invoqué par ctrl + alt + t, le résultat est bash(pas de tiret de tête). Pourriez-vous expliquer pourquoi?
Frozen Flame
@ freezed-flame L'un est un shell de connexion, l'autre ne l'est pas. Notez que les terminaux OS X Terminal et Linux ont un comportement différent à cet égard.
Daniel Beck
@DanielBeck n'est pas une preuve que l'autre n'est pas un shell de connexion. Lorsque bash est lancé avec un --loginargument, il ne change pas son argv[0], mais agit comme un shell de connexion.
Ruslan
@Ruslan Bien sûr, en théorie, il pourrait toujours s'agir d'un shell de connexion. Mais ce n'est pas. (Au moins, je serais extrêmement surpris si c'était le cas.)
Daniel Beck