bash xargs:相同的命令给出不同的输出

bash xargs:相同的命令给出不同的输出

当我跑步时

ls -1 *.a | xargs -I{} echo {} | sed 's/.a//'

输出为

1
2
3

当我跑步时

ls -1 *.a | xargs -I{} bash -c "echo {} $(echo {} | sed 's/.a//')"

输出为

1.a 1.a
2.a 2.a
3.a 3.a

出现这种异常的原因是什么?

答案1

我们假设您的目录中存在文件1.a、、2.a3.a

使用命令

ls *.a | xargs -I{} echo {} | sed 's/.a//'

您没有子 shell, 的输出ls通过管道输入,xargs进行替换。然后输出通过管道输入sed。从这里开始,您得到第一个结果。

使用命令

ls *.a | xargs -I{} bash -c "echo {} $(echo {} | sed 's/.a//')"

你有一个新元素$(echo {} | sed 's/.a//')

它被扩展并变成

echo {}                # -- > {}
echo {} | sed 's/.a//' # -- > {}  again the same.

所以你的命令可以是重写作为

 ls *.a | xargs -I{} bash -c "echo {} {} "

这给出了你的第二个输出。

正如刚才所说客人在他的评论中调试你的脚本 [1](或命令);使用以下set -x命令在当前 shell 或脚本中启用调试,使用set +x以下命令禁用它:

set -x    
ls *.a | xargs -I{} bash -c "echo {} $(echo {} | sed 's/.a//')"
set +x    

你会看到每一步

+ ls --color=auto 1.a 2.a 3.a
++ echo '{}'
++ sed s/.a//
+ xargs '-I{}' bash -c 'echo {} {}'
1.a 1.a
2.a 2.a
3.a 3.a

相关内容