我有兩個問題。我試圖透過管道傳遞文件作為參數,並且我試圖將該文件用作sh
函數內的變數。
這是我的命令:
find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh
在這裡,我的行是查找所有看起來像“ segment.something
”的文件並將其傳遞到管道的右側。在 中someFunction.sh
,我需要檔案名稱作為參數。假設正在輸入的檔案segment1
。
將列印出(例如)someFunction.sh
的每一行。segment1
如何將輸出從管道的左側傳遞到右側,然後如何在內部呼叫它someFunction.sh
?
答案1
你的命令
$ find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh
其效果是,最多someFunction.sh
並行啟動 4 個 shell 腳本副本 ( -P 4
)(舊副本完成後將立即產生新副本),每個副本都將一個檔案名稱作為其參數 ( -n 1
)。
這意味著腳本的每次呼叫都將類似於
sh someFunction.sh segmentsomething
在腳本內部,shell 會將以下值放入位置參數(命令列上的參數) into$1
等$2
($0
通常包含腳本本身的名稱)。在您的情況下,$1
將包含文件的名稱,其他將為空。
所以,在腳本中:
filename="$1"
echo "$filename"
cat "$filename"
就是這樣。現在,通常當人們用來find
尋找檔案並將其檔案名稱傳遞給時,xargs
會出現人們傾向於互相提醒的不穩定檔案名稱的問題,我也會在這裡這樣做。
該find
實用程式傳遞由空格分隔的檔案名稱。如果您的檔案名稱中含有空格,那就不好了,因為這會導致使用xargs
正確的名稱呼叫腳本時出現問題。
因此,最好的做法是總是使用-print0
withfind
和-0
with xargs
,這意味著檔案名稱不是用空格分隔,而是用nul
字元 ( \0
) 分隔。這使得它更加安全。
因此:
$ find . -name 'segment*' -print0 | xargs -0 -n1 -P4 sh someFunction.sh
答案2
someFunction.sh
假設在您的工作目錄中,您可以使用類似的東西。
find . -name 'segment*' -print0| xargs -0 -n1 -P4 ./someFunction.sh
和允許名稱中包含空格的檔案(常見問題)-print0
。-0
在我的someFunction.sh
我有
#!/bin/bash
echo "Arg: " $1
cat $1
它只是回顯文件名,然後寫入傳遞給的文件內容someFunction.sh