Ich habe eine Bash-Quelle run.sh
wie folgt:
#!/bin/bash
if [ $# -ne 1 ]; then
exit
fi
...
Wenn ich es auf zwei Arten ausführe, gibt es unterschiedliche Verhaltensweisen. Der erste Weg ist,
source run.sh
Das Terminal wird nach der Ausführung geschlossen. Der zweite Weg ist,
./run.sh
Dadurch wird das Skript einfach beendet und auf dem Terminal verbleibt. Ich frage, ob es einen Befehl zum Beenden eines Bash-Skripts für beide source run.sh
und zur ./run.sh
Ausführung gibt. Ich habe es auch versucht return
, was unter ./run.sh
Ausführung nicht gut funktioniert .
Im Allgemeinen interessiert mich, warum dies geschieht und was der Unterschied zwischen der Verwendung von "Quelle" und "Quelle" ist. für die Skriptausführung?
$- = *i*
funktioniert?-
enthält die aktuell aktiven Optionsflags. Der Test prüft, ob das-i
Flag aktiv ist. Siehe gnu.org/software/bash/manual/html_node/Special-Parameters.htmlStellen Sie sich den Befehl 'source' wie in der Anweisung 'include' vor. Es nimmt den Inhalt des Arguments und führt es so aus, als ob es direkt ausgeführt würde. In diesem Fall ist Ihr Befehl 'source' mit dem Argument 'run.sh' und run.sh wird genau so ausgeführt, als hätten Sie den Inhalt von run.sh in Ihre Befehlszeile eingegeben.
Wenn Sie './run.sh' ausführen, ist './run.sh' Ihr Befehl und hat keine Argumente. Da diese Datei im Klartext und nicht binär ist, sucht Ihre Shell beim Shebang ('#!' In der ersten Zeile) nach einem Interpreter und findet '/ bin / bash'. Ihre Shell startet dann eine neue Instanz von bash und der Inhalt von run.sh wird in dieser neuen Instanz ausgeführt.
Wenn bash den Befehl 'exit' erreicht, wird es zunächst genau so ausgeführt, als hätten Sie ihn in die Befehlszeile eingegeben. In den zweiten Fällen wird es im Bash-Prozess ausgeführt, den Ihre Shell gestartet hat. Daher erhält nur diese Bash-Instanz den Befehl 'exit'.
Wenn Sie eine Zeile in bash eingeben, wird alles vor dem ersten Leerzeichen als Befehl und alles, was folgt, als Argument behandelt. Der Befehl '.' ist ein Alias von 'source'. Wenn du rennst '. run.sh 'the'. ' ist ein eigenständiger Befehl, da er durch ein Leerzeichen von seinen Argumenten getrennt ist. Wenn Sie './run.sh' ausführen, lautet Ihr Befehl './run.sh' und '.' ist Teil des relativen Pfads zu run.sh mit dem '.' Darstellen Ihres aktuellen Ordners.
quelle