entr
wird 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 entr
die 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/bash
vor 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 dieSHELL
Umgebungsvariable.
Nicht notwendigerweise /bin/bash
die Shell, von der es aufgerufen wurde, oder die Login-Shell des Benutzers.
Wenn SHELL
nicht definiert ist (muss es auch nicht, in einem Skript etc.), entr
setzt dann es selbst auf /bin/sh
, was unter Debian ist dash
, eine Shell, die die von exportierten Funktionen nicht verwenden kann bash
und darüber hinausentfernenaus der Umwelt.