xargs -I
不适用于子命令
例子:
# Not working
ls .... | xargs -n 1 -I % sh -c "cmd $(cmd2 % )"
# working
ls .... | xargs -n 1 -I % sh -c "cmd % "
有什么办法可以解决如何在儿童班级中进行替换吗?
答案1
问题是 shell 会扩展双引号字符串参数中的命令替换xargs
甚至在开始之前,这意味着 shell 将cmd2
使用文字参数运行%
来计算 的最后一个参数xargs
。
您的第二个示例命令不存在此问题,因为末尾的 shell 代码参数不包含调用 shell 在启动之前需要处理的任何扩展xargs
。
您可以在第一个命令中通过简单地单引号参数而不是双引号来解决这个问题。
然而,有充分的理由说明解析 的输出ls
是一个坏主意。由于您将%
占位符嵌入到将由 执行的 shell 代码中,因此如果任何文件名包含引用或通配字符或扩展(例如或任何其他扩展),sh -c
您也会遇到真正的问题。$(...)
在这种情况下,使用普通的 shell 循环会更安全:
for name in ...; do cmd "$(cmd2 "$name")"; done
或者,可以说更具可读性,
for name in ...; do
cmd "$(cmd2 "$name")"
done
...哪里...
是与您感兴趣的名称相匹配的模式。
也可以看看:
也相关(%
在 shell 代码中嵌入 with 与在 shell 代码中xargs
嵌入 with 具有相同的问题):{}
find