带有-d标志的xargs和使用替换会导致额外的“空”项被处理

时间:2013-02-15 02:07:49

标签: xargs

使用xargs中的-d标志指定分隔符似乎是在最后一个值之后添加换行符。无论哪种方式,当使用替换将值粘贴到命令的中间时,它会导致命令中断(相对于让xargs将值传递给命令末尾的更“标准”方式)。

要改写,只有在使用-d-I标志并将值粘贴到命令中间时才会发生这种情况。

我该如何解决这个问题?

示例:

# echo "server1 server2 server3 server4"|xargs -r -d" " -I+ echo ssh + "sudo service myservice restart"
ssh server1 sudo service myservice restart
ssh server2 sudo service myservice restart
ssh server3 sudo service myservice restart
ssh server4
 sudo service myservice restart

注意最后一个命令被换行符偏移。如果命令在换行符处结束,这不会成为问题,但在这种情况下它不会。

我通过将" null"添加到我传递给xargs的列表末尾并忽略产生的错误来解决这个问题。但这是一个糟糕的解决方案,在某些情况下很危险。

我的解决方法:

# echo "server1 server2 server3 server4 null"|xargs -r -d" " -I+ echo ssh + "sudo service myservice restart"
ssh server1 sudo service myservice restart
ssh server2 sudo service myservice restart
ssh server3 sudo service myservice restart
ssh server4 sudo service myservice restart
ssh null
 sudo service myservice restart

1 个答案:

答案 0 :(得分:1)

xargs并没有在新线上进攻;它只是因为换行符不再是分隔符,所以已经在输入中的换行符就是字面意思。

如果您实际使用echo向xargs提供输入,请使用echo -n以便它不会添加换行符。如果您使用的不是echo,请调查如何使其不添加尾随换行符,或使用trsedperl或其他内容删除换行符。