
Ich habe ein Fish-Skript, das einige Variablen exportiert und am Ende einen Befehl ausführt. Ich möchte diese Datei als Quelle verwenden können, um diese Variablen in die aktuelle Shell-Sitzung zu bringen, ohne jedoch den Befehl am Ende auszuführen.
Die Frage: Kann ich herausfinden, ob die aktuelle Datei ausgeführt wird oder aus der Datei selbst stammt?
Antwort1
$_
Sie können die Umgebungsvariable verwenden, um zu sehen, ob Ihr Skript durch den source
folgenden Befehl „ausgeführt“ wird:
#!/bin/fish
if test "$_" = source
echo got sourced
else
echo was execed
end
Antwort2
Sie können die $_
Umgebungsvariable verwenden, um zu sehen, ob Ihr Skript vom source
Befehl „ausgeführt“ wird. Beachten Sie, dass der source
Befehl einen gemeinsamen Alias („ .
“) hat, daher müssen Sie die $_
Umgebungsvariable sowohl mit source
als auch vergleichen .
.
#!/bin/fish
if test "$_" != "source" -a "$_" != "."
echo "not sourced"
else
echo "was sourced"
end
Eine häufige Verwendung hierfür kann darin bestehen, dem Benutzer eine Warnung auszugeben, wenn für das Skript keine Quelle angegeben wurde:
if test "$_" != "source" -a "$_" != "."
echo "Run this script with \". ./activate.fish\" (aka: \"source ./activate.fish\")."
exit 1
end
Ersetzen Sie es activate.fish
natürlich durch den Namen Ihres Skripts.
Antwort3
Ich glaube, Sie verstehen nicht, was das „Sourcen“ eines Skripts bewirkt. Im Allgemeinen wird ein Skript durch die Ausführung in einem separaten Prozess ausgeführt. Durch das „Sourcen“ wird es imaktuelle Shell. Es wird trotzdem jede Zeile ausgeführt.
Wahrscheinlich möchten Sie die letzte Zeile herausfiltern. Versuchen Sie Folgendes:
source (sed '$d' filename | psub)
Der psub
Befehl wird verwendet, um die Ausgabe eines Prozesses so zu verarbeiten, als wäre es eine Datei.Dokumentation