xargs 如何将结果 {} 放入 $(cmd {}) 中?

xargs 如何将结果 {} 放入 $(cmd {}) 中?

例如: find /usr/lib -maxdepth 1 -type l -iname "*libblas*"|xargs -I{} echo "{} =>" $(realpath {}) 我希望它输出:

/usr/lib/libblas.so.3gf=>/usr/lib/libblas/libblas.so.3gf.0
/usr/lib/libblas.so=>/usr/lib/libblas/libblas.so.3gf.0
/usr/lib/libblas.a=>/usr/lib/libblas/libblas.a

这将不起作用,因为 in 的值$()在脚本实际运行之前已扩展。

有什么方法可以达到这个结果吗? bash 中没有循环?

答案1

你可以试试这个方法

find /usr/lib -maxdepth 1 -type l -iname "*lib*" -print \
   | xargs -P1 -I{} -- sh -c 'echo -n " {} => " && realpath "{}"'

答案2

  find /usr/lib -maxdepth 1 -type l -iname "*libblas*"|xargs -I{} sh -c 'echo "{} =>" $(realpath {})'

基本上你必须启动一个子shell。 FWIW我不知道什么是真实路径;如果它是别名或函数,您的子 shell 可能需要是 bash。

相关内容