[英]problems with source command in shell
下午好,我有以下命令為我運行“ code.sh”文件,該文件我傳遞了一個參數“ $ 1”,問題是我想與“ source”一起運行“ code.sh”,這是我的命令:
find . -name "*.txt" -type f -exec ./code.sh {} \;
我做得很好
source ./code.sh
這很棘手。 當您獲取腳本的source
,需要在當前shell中而不是在子shell或子進程中執行。 從find
執行source
將不起作用,因為find
是一個子進程,因此對環境變量的更改將丟失。
這是相當的round回,但是您可以使用循環來解析find
的輸出,並直接在頂級外殼程序中運行source
命令(使用進程替換 )。
while read -d $'\0' fileName; do
source code.sh "$fileName"
done < <(find . -name "*.txt" -type f -print0)
現在問-print0
和-d $'\\0'
什么? 一起使用這兩個標志是使腳本更加安全的一種方法。 † UNIX中的文件名允許包含很多奇數字符,包括空格,制表符甚至換行符。 換行符很少見,但確實是合法的。
-print0
告訴find
使用NUL字符( \\0
)分隔文件名,而不是默認的換行符( \\n
)。 這樣做意味着包含\\n
文件名不會弄亂循環。 使用\\0
作為分隔符效果很好,因為\\0
不是文件名中的合法字符。
-d $'\\0'
‡與另一面的read
功能相同。 它告訴read
用\\0
而不是\\n
分隔行。
†您以前可能已經看過這個技巧。 寫find ... -print0 | xargs -0 ...
find ... -print0 | xargs -0 ...
可以在將find
與xargs
配對時獲得相同的安全性。
‡如果您想知道$'...'
:這是Bash ANSI-C引用語法,用於編寫包含轉義碼的字符串文字。 美元符號加單引號。 您可以為換行符寫$'\\n'
或為制表符寫$'\\n'
$'\\t'
或為NUL寫$'\\0'
。
您將無法以這種方式使用find
; 它將始終在單獨的進程(而不是當前的shell)中執行命令。 如果您使用的是bash
4,則可以使用find
的簡單替代方法:
shopt -s globstar
for f in **/*.txt; do
[[ -f $f ]] && source code.sh "$f"
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.