Bash
從 find 呼叫函式時的變數範圍
在 bash 腳本中,我定義了一個從
find
. 問題是變數的範圍沒有擴展到函式。如何從函式中訪問變數?這是一個例子:variable="Filename:" myfunction() { echo $variable $1 } export -f myfunction find . -type f -exec bash -c 'myfunction "{}"' \;
這將輸出文件名,但沒有字元串“文件名:”。
是否有更好的方法來呼叫函式,
find
以便為find
找到的每個文件呼叫它,並且仍然定義變數?
您可以聲明
variable
為環境變數,即export variable="Filename:"
不是您問題的答案,但不要這樣做:
find . -type f -exec bash -c 'myfunction "{}"' \;
除了不可移植之外,它也非常危險,因為文件名最終會被解釋
bash
為 shell 程式碼。例如,考慮一下如果那裡有一個文件呼叫會發生什麼$(rm -rf ~)
。寫下來:find . -type f -exec bash -c 'myfunction "$1"' find+bash {} \;
甚至更好(避免
bash
每個文件執行一個):find . -type f -exec bash -c 'for file do myfunction "$file"; done' find+bash {} +
現在回答您的問題:
你可以這樣做:
{ find . -type f -exec printf '%s\0' {} + | while IFS= read -ru3 -d '' file; do myfunction "$file"; done 3<&0 <&4 4<&-; } 4<&0
這樣,您在
myfunction
目前bash
shell 中呼叫,因此您不需要導出myfunction
或執行其他bash
shell。如果您
find
支持-print0
謂詞(如 GNU、busybox 和一些 BSDfind
),則可以替換-exec printf '%s\0' {} +
為-print0