反引号替换中带有空格的文件名

Bal*_*ath 6 shell bash quoting command-substitution

假设我有一个文件名中包含一个空格,例如with space. cmd在下面的代码段中应该输出什么ls来接受“带空格”作为参数?

$ ls `cmd`
Run Code Online (Sandbox Code Playgroud)

我试过了ls `echo 'with space'`。传递给的参数ls'withspace'。尝试使用反斜杠转义空间也不起作用。我看到使用ls "`cmd`"作品。但是,如果我想将多个文件作为参数传递给ls一些可能包含空格的文件,这将不起作用。

命令替换手册也显得稀少。https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html

更一般地说,如果 cmd 想要输出一个文件列表,然后可以使用反引号替换来替换这些文件以供另一个命令使用,那么它所遵循的输出格式是什么?

ilk*_*chu 6

我看到使用ls "`cmd`"作品。但是,如果我想将多个文件作为参数传递给 ls 并且其中一些可能包含空格,这将不起作用。

没错。这与将命令存储在变量中的问题相同(例如讨论here),它真的不能很好地完成。想到的选项是:

  • cmd输出的文件名的一个NUL分隔的列表,然后通过管道到xargs -0将它们传递给另一个命令
  • 设置IFS为某个未出现在任何文件名中的字符,并cmd输出由该字符分隔的文件列表
  • cmd输出正确引用shell的文件名,然后运行它通过eval

像这样:

$ touch "with space" "another space"
$ printf "%s\0" "with space" "another space" | xargs -0 ls -i
1705749 another space  1705230 with space
$ set -f; IFS=%; ls -i $(echo "with space%another space")
1705749 another space  1705230 with space
$ eval ls -i "$(echo '"with space" "another space"')"
1705749 another space  1705230 with space
Run Code Online (Sandbox Code Playgroud)

或者,find -exec ...如果您可以cmd用它替换,请使用。