使用带有 entr 的文件标记

使用带有 entr 的文件标记

我添加了以下代码,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将扩展为脚本的文件名。要防止$0shell 进行变量替换,请使用\

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"

相关内容