Bash

使用帶有 entr 的文件標記

  • October 12, 2021

我有以下程式碼,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

請問,為什麼?

您正在從 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)。此外,請考慮在腳本中添加shebang,並省略不必要的單詞function

#!/bin/bash
my_function(){
   echo "I've just seen $1"
}
typeset -fx my_function

find . -name "*.md" |
   entr -r -s "my_function \$0"

引用自:https://unix.stackexchange.com/questions/672747