
Ich habe es selbst gemerkt; ich konnte mich nicht als Root anmelden, nachdem ich ein Skript erstellt und es von aufgerufen hatte ~/.bashrc
.
~/.bashrc:
#... do stuff then run my script
source ~/myscript.sh
~/meinscript.sh:
#!/bin/bash
if [myConditional]; then
exit
fi
# otherwise do stuff
Ich hatte gehofft, dass myscript.sh ausgeführt wird, wenn ich mich als Root anmelde. Und wenn myConditional wahr ist, wird myscript.sh keine weiteren Befehle mehr ausführen, sondern zu .bashrc zurückkehren und der Benutzer bleibt wie gewohnt als Root angemeldet. Aber stattdessen konnte ich mich überhaupt exit
nicht anmelden! Ich wurde nur zu einer Anmeldeaufforderung zurückgeführt.
Gibt es einen anderen Befehl, den ich außer verwenden sollte exit
? Natürlich könnte ich die if
Anweisung einfach erweitern, indem ich eine else
Anweisung einfüge und entferne exit
, aber aus pädagogischen Gründen würde ich gerne wissen, ob es einen geeigneteren Ansatz gibt. (Auch teilweise, weil ich tief verschachtelte Anweisungen vermeiden möchte if
; es könnte ein ziemlich großes Skript werden)
Antwort1
source filename.sh
(oder . filename.sh
) führt den Inhalt vonfilename.sh
im aktuellen Interpreter(im Wesentlichen so, als ob Sie den Inhalt an dieser Stelle kopiert hätten). Folglich exit
wird dieser Interpreter beendet.
Wenn Sie das Skript einfach als separates Programm ausführen möchten, verwenden Sie nicht source
: ~/myscript.sh
es wird nur ausgeführt, wenn Sie es zuerst mit ausführbar machen chmod +x ~/myscript.sh
, oder Sie können verwenden, bash ~/myscript.sh
wenn Sie es bevorzugen. Dadurch wird eine neue Shell gestartet, um Ihr Skript auszuführen, als wäre es ein beliebiges anderes Programm auf dem System.
Wenn Sie es andererseits mit source
Ihrem Skript ernst meinen (weil es beispielsweise Umgebungsvariablen setzen wird), können Sie die Ausführung des Rests der Datei stoppen, ohne .bashrc
die Shell, die es ausgeführt hat, zu beeinträchtigen.mitreturn
:
return
kann auch verwendet werden, um die Ausführung eines Skripts zu beenden, das mit dem integrierten.
(source
) ausgeführt wird. Es gibt entwedern
oder den Beendigungsstatus des letzten im Skript ausgeführten Befehls als Beendigungsstatus des Skripts
In diesem Fall myscript.sh
würde Ihre Datei Folgendes enthalten:
if [[ condition ]]
then
return 0
fi
mit dem gewünschten Effekt.