Kann ein Fish-Skript zwischen der Beschaffung und der Ausführung unterscheiden?

Kann ein Fish-Skript zwischen der Beschaffung und der Ausführung unterscheiden?

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 sourcefolgenden 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 sourceBefehl „ausgeführt“ wird. Beachten Sie, dass der sourceBefehl einen gemeinsamen Alias ​​(„ .“) hat, daher müssen Sie die $_Umgebungsvariable sowohl mit sourceals 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.fishnatü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 psubBefehl wird verwendet, um die Ausgabe eines Prozesses so zu verarbeiten, als wäre es eine Datei.Dokumentation

verwandte Informationen