xargs 的意外输出

xargs 的意外输出

下面的语句应该打印, afc abc但它却打印了 abc abc 。我尝试了很多次,但每次的结果都是一样的,不知道为什么会发生这种情况,有人可以解释并帮助我吗?

echo abc|xargs -i{} echo $(echo {}|sed 's/b/f/g') {}

答案1

是的,确实如此,因为命令替换是由 shell 在xargs启动之前执行的。替换中的打印要操作的echo文字字符串。不对其进行任何更改,结果是看到{}sedsedxargs

echo {} {}

反而:

echo 'abc' | xargs -I{} bash -c 'echo "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}

在这里,我们通过将命令替换嵌入到内联脚本中来防止 shell 评估命令替换。该脚本从 中获得命令行参数 ( abc)xargs并将其操作为"$1"

printf如果您想用a破折号和其他字符替换为可被解释为选项的内容,那么使用它会更好echo

echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}

或者,没有sed

echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "${1//b/f}" "$1"' bash {}

或者,您可以单独完成sed(至少在这个简单的示例中):

echo 'abc' | sed 'h; s/b/f/g; G; s/\n/ /'

相关内容