Führen Sie eine Funktion von bashrc aus, ändern Sie jedoch die exportierte Variable

Führen Sie eine Funktion von bashrc aus, ändern Sie jedoch die exportierte Variable

Ich versuche, eine Funktion von meiner Bashrc aus auszuführen, die jede Minute aktualisiert wird und eine Variable externalisiert. Sie sieht folgendermaßen aus:

export CFN = ''
_some_fn
{
    export CFN = 'test'
    sleep 60
    _some_fn &
}
_some_fn &

Wobei „Test“ variabel ist, aber wenn ich dies als Quelle verwende, habe ich innerhalb der Funktion keinen Zugriff auf die CFN, was vermutlich daran liegt, dass sie in der Subshell ausgeführt wird. Gibt es eine Möglichkeit, den Wert der exportierten CFN zu ändern?

Antwort1

Dies ist mit Ihrer aktuellen Funktion nicht möglich. Sobald Sie sie in den Hintergrund stellen, &erstellt sie eine Kopie des Prozessstapels und verlässt sie. Es gibt keine Möglichkeit, die Änderungen an Ihrem Stapel auf die Kopie des Jobs zu übertragen, es sei denn, Sie erstellen diese Funktion explizit. Ebenso ist es unmöglich, Änderungen am Stapel der Funktion in Ihren aktuellen Stapel zu übernehmen.

Sie könnten eine Interprozesskommunikation einrichten, um die Variable zu ändern, aber das ist immer ziemlich schwierig, richtig hinzubekommen, und ich bin mir nicht sicher, was Ihr Anwendungsfall ist. Beispiel für IPC in beide Richtungen:

mkfifo -m 600 /var/tmp/cfn-to-fn
mkfifo -m 600 /var/tmp/cfn-from-fn
export CFN = ''
_some_fn
{
     read CFN < /var/tmp/cfn-to-fn
     # do something with the new CFN here
     echo 'processed data' >/var/tmp/cfn-from-fn
     _some_fn &
}
_some_fn &
echo 'processme' > /var/tmp/cfn-to-fn
cat /var/tmp/cfn-from-fn

Es gibt viele Alternativen zu mkfifo, im Allgemeinen alle unter dem SchlagwortInterprozesskommunikation. Wenn Sie es für sinnvoll halten, die Dinge einfach zu halten, kümmern Sie sich nicht darum und schreiben Sie Ihre Daten einfach an einem Ende in eine Datei und lesen Sie sie am anderen Ende. D-Bus ist der große IPC-Bus auf den meisten Unix-Systemen, zusammen mit TCP/ oder UDP/IP (mit netcatoder nc), aber ich habe nicht viele Shell-Skripte gesehen, die diese verwenden.

Ihre letzte Alternative besteht darin, alles so zu belassen, wie es ist, und Ihr Skript zum Laufen zu bringen, ohne es als Hintergrundjob auszuführen, sodass Sie die Umgebung während der Ausführung optimieren können.

verwandte Informationen