簡體   English   中英

shell中的源命令問題

[英]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 ...可以在將findxargs配對時獲得相同的安全性。

如果您想知道$'...' :這是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM