Заставить «entr» выполнить локально определенную функцию оболочки

Заставить «entr» выполнить локально определенную функцию оболочки

entrиспользуется для запуска команд оболочки при изменении файлов. Следующий скрипт выведетФайл изменен.всякий раз, когда файл/tmp/data.txtизменен.

#!/usr/bin/env sh

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

Как только команды для выполнения станут более сложными, будет удобно перенести их в отдельную функцию и вызвать entrее, например, так:

#!/usr/bin/env sh

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

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

К сожалению, это вызываеткоманда не найденаошибка, которая предполагает, что моя локально определенная функция недоступна для entr. Есть ли способ заставить это работать и в чем здесь основная проблема?

С уважением

решение1

Если вы хотите использовать экспортированные функции bash внутри , export SHELL=/bin/bashперед вызовом следует выполнить команду .env -s cmdcmd

Как указано встраница руководстваиз entr(выделено мной):

-s Оцените первый аргумент с помощью интерпретаторауказанный SHELLпеременной окружения.

Не обязательно /bin/bash, из какой оболочки она была вызвана, или из какой оболочки пользователя она была введена.

Если SHELLне определено (это не обязательно, в скрипте и т. д.), то entrустановит его в /bin/sh, который в Debian является dash, оболочкой, которая не может использовать функции, экспортируемые , bashи, более того, будетудалятьих из окружающей среды.

Связанный контент