Bash
使用帶有 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
請問,為什麼?
您正在從 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
)。此外,請考慮在腳本中添加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"