Pourriez-vous expliquer les phrases suivantes du manuel de Bash $_
, en particulier les parties en gras, peut-être avec quelques exemples?
Au démarrage du shell, définissez le chemin d'accès absolu utilisé pour appeler le shell ou le script de shell en cours d'exécution tel que transmis dans l'environnement ou la liste d'arguments .
Par la suite , se développe jusqu'au dernier argument de la commande précédente, après expansion.
Définissez également le chemin d'accès complet utilisé pour appeler chaque commande exécutée et placée dans l'environnement exporté vers cette commande .
Lors de la vérification du courrier , ce paramètre contient le nom du fichier courrier.
Réponses:
Je suis d'accord, ce n'est pas très clair.
1. Au démarrage du shell,
si la
_
variable était dans l'environnement qui abash
reçu , puis labash
laisse intacte.En particulier, si ce
bash
shell a été invoqué par un autrebash
shell (cependantzsh
,yash
et certainesksh
implémentations le font également), alors cebash
shell aura défini la_
variable d'environnement sur le chemin de la commande en cours d'exécution (c'est le 3ème point de votre question). Par exemple, sibash
est invoqué pour interpréter un script à la suite d'une autrebash
interprétation du shell:Cela
bash
sera passé_=/path/to/bash-scrip
dans l'environnement donné àbash-script
, et c'est à cela que la valeur initiale de la$_
bash
variable sera dans lebash
shell qui interprète ce script.Maintenant, si l'application appelante ne transmet pas de
_
variable d'environnement , lebash
shell invoqué s'initialisera$_
à ceargv[0]
qu'il reçoit lui-même, ce qui pourrait êtrebash
, ou/path/to/bash
ou/path/to/some-script
ou autre chose (dans l'exemple ci-dessus, ce serait le/bin/bash
cas si le coup du script était#! /bin/bash
ou/path/to/bash-script
selon le système ).Ce texte est donc trompeur car il décrit le comportement de l'appelant qui
bash
n'a aucun contrôle sur. L'application invoquéebash
peut très bien ne pas être définie$_
du tout (en pratique, seuls certains shells et quelques rares applications interactives le font,execlp()
par exemple), ou elle pourrait l'utiliser pour quelque chose de complètement différent (par exemple, laksh93
définit sur*pid*/path/to/command
).2. Par la suite
La suite n'est pas très claire non plus. En pratique, c'est dès que l'on
bash
interprète une simple commande dans l'environnement shell actuel.Dans le cas d'un shell interactif , ce sera sur la première commande simple interprétée
/etc/bash.bashrc
par exemple.Par exemple, à l'invite d'un shell interactif:
Pour un shell non interactif , ce serait la première commande dans
$BASH_ENV
ou du code fourni à ce shell s'il$BASH_ENV
n'est pas défini.3. Lorsque Bash exécute une commande
Le troisième point est quelque chose de différent et est indiqué dans la discussion ci-dessus.
bash
, comme quelques autres shells transmettront une_
variable d'environnement aux commandes qu'il exécute qui contient le cheminbash
utilisé comme premier argument desexecve()
appels système.4. Lors de la vérification du courrier
Le quatrième point est décrit plus en détail dans la description de la
MAILPATH
variable:Exemple:
la source
Essayez cet exemple simple:
Exécutez-le en donnant le chemin absolu (
/home/$USERNAME/test.sh
); production:Le premier
$_
contient le chemin que vous avez utilisé pour appeler le script et le second contient le premier argument au milieuecho
. Pour le troisième élément de la liste, si vous démarrez un nouveau terminal et tapez echo,$_
il affichera la variable contenant lePATH
qui est généralement utilisé pour rechercher et appeler des commandes (dans ma machine Ubuntu) dans un shell normal ou un chemin absolu vers votre.bashrs
fichier dans un shell de connexion.Pour l'élément quatre de la page de manuel bash:
la source
echo $_
estEDITOR
, et pourquoi? Quel cas suit-il? (3) Pouvez-vous donner un exemple de la façon de vérifier les courriers et de les utiliser$_
dans ce cas?.bashrc
et commentez chaque ligne là-bas. Conservez une seule ligne contenant une commande similaireecho "test"
ou similaire. Sauver et fermer. Ensuite, exécutezbash
et immédiatementecho $_
. Ce dernier écho devrait imprimer test dans la sortie.MAILPATH
dans linuxcommand.org/lc3_man_pages/bash1.htmlPour le cas 2, un exemple vaut mille mots:
Fait ce que vous devinez / espérez. Me donne un espace réservé simple lorsque je suis sur la ligne de commande pour éviter de me répéter.
la source