为什么 subshel​​l 命令在通过 xargs 进行管道传输时不能与 echo 一起使用?

Why subshell command doesn't work with echo when piped via xargs?

当我将管道 xargs 与子外壳一起用于 echo 时,我得到了这个

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 参数不是一个选项

如果你想在子 shell 中执行 basename 然后使用它:

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

bar.jpg

我们将虚拟值 _ 作为 [=13=] 传递给子外壳,占位符 {} 将作为

传递给子外壳