Faça 'entr' executar uma função shell definida localmente

Faça 'entr' executar uma função shell definida localmente

entré usado para executar comandos shell quando os arquivos são alterados. O seguinte script produziráArquivo alterado.sempre que o arquivo/tmp/data.txté modificado.

#!/usr/bin/env sh

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

Uma vez que os comandos a serem executados se tornem mais complexos, seria conveniente movê-los para uma função separada e chamar entra função, assim:

#!/usr/bin/env sh

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

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

Infelizmente, isso levanta umacomando não encontradoerro, o que sugere que minha função definida localmente não está disponível para entr. Existe uma maneira de fazer isso funcionar e qual é o problema subjacente aqui?

Atenciosamente

Responder1

Você deve export SHELL=/bin/bashantes de invocar env -s cmdse quiser poder usar funções exportadas do bash dentro do cmd.

Conforme documentado nopágina de manualde entr(ênfase minha):

-s Avalie o primeiro argumento usando o intérpreteespecificado pela SHELLvariável de ambiente.

Não necessariamente /bin/basho shell de onde foi chamado ou o shell de login do usuário.

Se SHELLnão estiver definido (não é necessário, em um script, etc), então entrserá definido como /bin/sh, que no Debian é dash, um shell que não pode usar as funções exportadas por bashe, além disso, iráremovereles do meio ambiente.

informação relacionada