我正在尝试使用 entr 来监视一些文件。
我的脚本基于他们的示例:
do_it(){ echo Eita!; }
while true; do ls folder/* more-folder/* | entr -pd do_it; done
>> entr: exec do_it: No such file or directory
然而,这有效:
while true; do ls folder1/* folder2/* | entr -pd echo Eita!; done
我究竟做错了什么?
答案1
“while”循环中的管道在单独的子 shell 中运行。由于该do_it
函数未导出,因此运行的右侧子子 shellentr
不知道它。最短的解决方案是导出函数(bash 允许这样做)。
do_it(){ echo Eita!; }
export -f do_it
while true; do ls folder/* more-folder/* | entr -pd do_it; done
如果entr
命令想要从磁盘执行某些操作,那么我建议将该函数放入脚本文件中,然后entr
指向那。
文件名为 /path/to/do_it
#!/bin/sh
echo Eita!
确保文件可执行:
chmod +x /path/to/do_it
新命令行:
while true; do ls folder/* more-folder/* | entr -pd /path/to/do_it; done
答案2
entr的程序员回答(https://github.com/eradman/entr/issues/6): “函数可以导出到子shell,但不能用外部程序执行函数。如果要执行shell函数,可以编写如下循环:”
do_it(){ echo 'Eita!'; }
while true; do
ls folder1/* folder2/* | entr -pd -s 'kill $PPID'
do_it
done