【问题标题】:Why subshell command doesn't work with echo when piped via xargs?为什么通过 xargs 管道传输时 subshel​​l 命令不能与 echo 一起使用?
【发布时间】:2022-01-25 23:59:28
【问题描述】:

当我对echo 使用带有子shell 的管道xargs 时,我明白了

user@DESKTOP-P560BV8:~/tmp/t$ echo ./foo/bar.jpg | xargs -I{} echo "$(basename {})"
./foo/bar.jpg

但是,这行得通

user@DESKTOP-P560BV8:~/tmp/t$ echo ./foo/bar.jpg | xargs -I{} basename {}
bar.jpg

如果我内联参数值

user@DESKTOP-P560BV8:~/tmp/t$ echo "$(basename ./foo/bar.jpg)"
bar.jpg

我不明白为什么会这样?我需要xargs在文本的每一行分别执行,所以-0参数不是一个选项

【问题讨论】:

  • 命令替换在 xargs 运行之前扩展。

标签: bash xargs


【解决方案1】:

如果你想在子shell中执行basename,那么就这样使用它:

echo './foo/bar.jpg' |
xargs -I {} bash -c 'echo "$(basename "$1")"' _ '{}'

bar.jpg

我们将虚拟值_ 作为$0 传递给子shell,占位符{} 将作为$1 传递给子shell

【讨论】:

  • 使用这种技术,我们甚至可以消除调用basename,并为shell进程提供更多参数:... | xargs sh -c 'for arg; do echo "${arg##*/}"; done' _——这减少了需要生成的进程数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2012-03-05
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多