Von .bashrc mit „exit“ aufgerufenes Skript verhindert die Anmeldung

Von .bashrc mit „exit“ aufgerufenes Skript verhindert die Anmeldung

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 exitnicht 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 ifAnweisung einfach erweitern, indem ich eine elseAnweisung 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 exitwird dieser Interpreter beendet.

Wenn Sie das Skript einfach als separates Programm ausführen möchten, verwenden Sie nicht source: ~/myscript.shes wird nur ausgeführt, wenn Sie es zuerst mit ausführbar machen chmod +x ~/myscript.sh, oder Sie können verwenden, bash ~/myscript.shwenn 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 sourceIhrem Skript ernst meinen (weil es beispielsweise Umgebungsvariablen setzen wird), können Sie die Ausführung des Rests der Datei stoppen, ohne .bashrcdie Shell, die es ausgeführt hat, zu beeinträchtigen.mitreturn:

returnkann auch verwendet werden, um die Ausführung eines Skripts zu beenden, das mit dem integrierten .( source) ausgeführt wird. Es gibt entwedernoder den Beendigungsstatus des letzten im Skript ausgeführten Befehls als Beendigungsstatus des Skripts

In diesem Fall myscript.shwürde Ihre Datei Folgendes enthalten:

if [[ condition ]]
then
    return 0
fi

mit dem gewünschten Effekt.

verwandte Informationen