Bash

從 find 呼叫函式時的變數範圍

  • August 28, 2013

在 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目前bashshell 中呼叫,因此您不需要導出myfunction或執行其他bashshell。

如果您find支持-print0謂詞(如 GNU、busybox 和一些 BSD find),則可以替換-exec printf '%s\0' {} +-print0

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