0

使用-dxargs 中的标志来指定分隔符似乎会在最后一个值之后添加换行符。无论哪种方式,当使用替换将值粘贴到命令中间时,它都会导致命令中断(与让 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
4

1 回答 1

1

xargs 没有添加换行符;只是因为换行不再是分隔符,所以已经在您的输入中的换行将按字面意思进行。

如果您实际上echo用于向 xargs 提供输入,请使用echo -n它以使其不添加换行符。如果您使用的是 echo 以外的其他内容,请研究如何使其不添加尾随换行符,或使用trorsed或or 删除换行符perl

于 2013-02-15T02:16:59.957 回答