一般情況下,使用字符串替換替換到代碼是一個壞主意 - 在你的情況,如果你有一個腳本惡意的名稱,該名稱可以用來運行任意命令。 (當然,你正在執行這個腳本,但是在純粹處理數據和輸出文件名的情況下也是如此 - 所以最好養成一種健壯的方法)。
傳遞名稱作爲參數的腳本,而不是代他們到腳本(如xargs
會做,如果你加入-I
或-J
參數固定的用法:
# best-practice approach: run a completely fixed shell script, passing arguments on
# its command line.
xargs -P 8 -n 1 \
sh -c 'for x; do csh "${x}.csh" >"${x}.log" 2>&1; done' _
你請注意,有一個sh -c
實例被調用:這是必需的,因爲xargs
本身不理解shell操作,例如重定向;如果您想要執行重定向,則需要一個shell才能執行。
現在,讓我們多一點到,爲什麼你的原碼的表現,因爲它沒有:
xargs -P 8 % csh '%'.csh >& '%'.log
... 第一執行重定向到%.log
,然後運行命令
xargs -P 8 % csh '%'.csh
xargs
沒有機會取代%.log
因爲該重定向是在命令完全運行之前由封裝外殼執行的。
感謝您的詳細解答。 –
@WillPhilpott,如果這可以解決您的問題,請考慮點擊答案旁邊的複選框以標記已回答的問題。 –