J'ai une source bash run.sh
comme suit,
#!/bin/bash
if [ $# -ne 1 ]; then
exit
fi
...
quand je l'exécute de deux manières, il y a des comportements différents. La première façon est,
source run.sh
Il fermera le terminal après exécution. La deuxième façon est,
./run.sh
cela terminera simplement l'exécution du script et restera sur le terminal. Je demande s'il y a une commande pour quitter un script bash pour les deux source run.sh
et l' ./run.sh
exécution. J'ai essayé return
aussi, ce qui ne fonctionne pas bien en cours d' ./run.sh
exécution.
Plus généralement, je suis intéressé par la raison pour laquelle cela se produit, et quelle est la différence entre l'utilisation de "source" et "." pour l'exécution de script?
$- = *i*
?-
contient les drapeaux d'options actuellement actifs. Le test vérifie si le-i
drapeau est actif. Voir gnu.org/software/bash/manual/html_node/Special-Parameters.htmlConsidérez la commande «source» comme dans l'instruction «include». Il prend le contenu de l'argument et l'exécute comme s'il avait été exécuté directement. Dans ce cas, votre commande est «source» avec un argument «run.sh» et run.sh est exécuté exactement comme si vous aviez tapé le contenu de run.sh dans votre ligne de commande.
Lorsque vous exécutez './run.sh', './run.sh' est votre commande et elle n'a aucun argument. Comme ce fichier est en texte brut et non binaire, votre shell recherche un interprète au niveau du shebang ('#!' Sur la première ligne) et trouve '/ bin / bash'. Votre shell démarre alors une nouvelle instance de bash et le contenu de run.sh est exécuté à l'intérieur de cette nouvelle instance.
Dans le premier cas, lorsque bash atteint la commande «exit», il est exécuté exactement comme si vous l'aviez tapé dans la ligne de commande. Dans les deuxièmes instances, il est exécuté dans le processus bash que votre shell a démarré, donc seule cette instance de bash reçoit une commande 'exit'.
Lorsque vous tapez une ligne dans bash, tout ce qui précède le premier espace est traité comme une commande et tout ce qui suit est traité comme des arguments. La commande '.' est un alias de «source». Quand tu cours '. run.sh 'le'. ' est une commande à part entière car elle est séparée de ses arguments par un espace. Lorsque vous exécutez './run.sh', votre commande est './run.sh' et '.' fait partie du chemin d'accès relatif à run.sh avec le '.' représentant votre dossier actuel.
la source