Find
使用 find -exec 保留環境變數
是否可以使用 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 變數
myvar1
和myvar2
,然後我設置它們並導出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
輸出一個空行)。