Lassen Sie „entr“ eine lokal definierte Shell-Funktion ausführen

Lassen Sie „entr“ eine lokal definierte Shell-Funktion ausführen

entrwird verwendet, um Shell-Befehle auszuführen, wenn sich Dateien ändern. Das folgende Skript gibt ausDatei geändert.wenn die Datei/tmp/data.txtwird geändert.

#!/usr/bin/env sh

echo "/tmp/data.txt" | entr -s 'echo "File changed."'

Wenn die auszuführenden Befehle komplexer werden, ist es praktisch, sie in eine separate Funktion zu verschieben und entrdie Funktion wie folgt aufzurufen:

#!/usr/bin/env sh

foo() { echo "File changed!"; }

echo "$0" | entr -s 'foo' # Error: command not found: foo

Leider wirft dies eineBefehl nicht gefundenFehler, der darauf schließen lässt, dass meine lokal definierte Funktion nicht verfügbar ist entr. Gibt es eine Möglichkeit, dies zum Laufen zu bringen, und was ist hier das zugrunde liegende Problem?

Mit freundlichen Grüße

Antwort1

Sie sollten dies export SHELL=/bin/bashvor dem Aufruf tun env -s cmd, wenn Sie in der Lage sein möchten, von Bash exportierte Funktionen darin zu verwenden cmd.

Wie dokumentiert in dermanpagevon entr(Hervorhebung von mir):

-s Bewerten Sie das erste Argument mit dem Interpreterangegeben durch die SHELLUmgebungsvariable.

Nicht notwendigerweise /bin/bashdie Shell, von der es aufgerufen wurde, oder die Login-Shell des Benutzers.

Wenn SHELLnicht definiert ist (muss es auch nicht, in einem Skript etc.), entrsetzt dann es selbst auf /bin/sh, was unter Debian ist dash, eine Shell, die die von exportierten Funktionen nicht verwenden kann bashund darüber hinausentfernenaus der Umwelt.

verwandte Informationen