![使用带有 entr 的文件标记](https://linux22.com/image/196925/%E4%BD%BF%E7%94%A8%E5%B8%A6%E6%9C%89%20entr%20%E7%9A%84%E6%96%87%E4%BB%B6%E6%A0%87%E8%AE%B0.png)
我添加了以下代码,myscript.sh
以便.md
在修改此文件时在扩展名的文件上执行函数:
function my_function(){
echo "I\'ve just seen $1"
}
typeset -fx my_function
find . -name "*.md" |
entr -r -s "my_function $0"
进入文档: * [...] 触发事件的第一个文件的名称可以从 $0 读取。*
我预计当我更改 README.md 时,输出将是:“我刚刚看到 README.md”
实际上,当我启动脚本并更改 README.md 时,会出现以下输出:
bash myscript.sh
# output: I've just seen myscript.sh
请问,为什么?
答案1
您正在从 shell 脚本调用 entr。当 shell 执行变量替换(或参数扩展在手册中),$0
将扩展为脚本的文件名。要防止$0
shell 进行变量替换,请使用\
:
find . -name "*.md" | entr -r -s "my_function \$0"
编辑:正如 @roaima 提醒的,另一种方法是使用单引号,它可以保护整个引用的文本:
find . -name "*.md" | entr -r -s 'my_function $0'
注意:如果SHELL
环境变量设置为与 bash 不兼容的内容,typeset -fx my_function
则可能对 entr 根本不起作用(例如,它不适用于SHELL=/bin/mksh
)。另外,考虑添加一个舍邦到你的脚本中,并省略不必要的单词function
:
#!/bin/bash
my_function(){
echo "I've just seen $1"
}
typeset -fx my_function
find . -name "*.md" |
entr -r -s "my_function \$0"