一般情况下,使用字符串替换替换到代码是一个坏主意 - 在你的情况,如果你有一个脚本恶意的名称,该名称可以用来运行任意命令。 (当然,你正在执行这个脚本,但是在纯粹处理数据和输出文件名的情况下也是如此 - 所以最好养成一种健壮的方法)。
传递名称作为参数的脚本,而不是代他们到脚本(如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,如果这可以解决您的问题,请考虑点击答案旁边的复选框以标记已回答的问题。 –