当我跑步时
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.a
。3.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