Find

使用 find -exec 保留環境變數

  • February 15, 2022

是否可以使用 find -exec 保留環境變數?我沒有看到任何使用 FreeBSD 版本的 find 的選項。如果絕對需要,我可以切換到 for 循環,但希望使用 exec 的簡潔性以及它更快。

我能想到的另一個選項並不漂亮,那就是轉儲環境,然後在我正在執行的命令中讀回它。

編輯:

find . -type f -name '*/*.patch/go' -exec go install {} \;

在這個例子中,我想去使用 http 代理。我已經有程式碼告訴 git 配置全域 http 代理(在此之上)。

所以,從下面的例子中,我需要在前面加上 sh? 為什麼?

子程序總是繼承環境。這意味著您啟動的實用程序find ... -exec將有權訪問該環境。

測試這個:

$ unset -v myvar1 myvar2
$ export myvar1='hello world'
$ myvar2='not exported'
$ find . -exec sh -c 'for pathname do printf "found %s, myvar1=%s, myvar2=%s\n" "$pathname" "$myvar1" "$myvar2"; done' sh {} +
found ., myvar1=hello world, myvar2=
found ./.bash_profile, myvar1=hello world, myvar2=
found ./.bashrc, myvar1=hello world, myvar2=
found ./.yashrc, myvar1=hello world, myvar2=
found ./.zshrc, myvar1=hello world, myvar2=

這裡我清除了兩個 shell 變數myvar1myvar2,然後我設置它們並導出myvar1但不是myvar2。這意味著myvar1將由任何子程序繼承,而myvar2不會被繼承。

正如您在 的輸出中看到的那樣find,導出myvar1的文件在單引號sh -c腳本中可用,該腳本find呼叫-exec成批找到的路徑名。

您也可以在命令前面使用賦值find來設置環境變數的值,而無需在目前 shell 中設置它。這是標準語法,而不僅僅是find工作原理。

$ unset -v myvar1 myvar2
$ myvar2='now in environment' find . -exec sh -c 'for pathname do printf "found %s, myvar1=%s, myvar2=%s\n" "$pathname" "$myvar1" "$myvar2"; done' sh {} +
found ., myvar1=, myvar2=now in environment
found ./.bash_profile, myvar1=, myvar2=now in environment
found ./.bashrc, myvar1=, myvar2=now in environment
found ./.yashrc, myvar1=, myvar2=now in environment
found ./.zshrc, myvar1=, myvar2=now in environment

此語法的另一個不使用的範例find

$ unset -v x
$ x='hello there' sh -c 'printf "%s\n" "$x"'
hello there
$ printf "%s\n" "$x"

注意x目前shell中未設置的方式(最後printf輸出一個空行)。

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