假设我有一个文件名称中包含空格,例如with space
.cmd
下面的代码片段中应该输出什么ls
来接受“with space”作为参数?
$ ls `cmd`
我试过ls `echo 'with space'`
。传递给的参数ls
是'with
和space'
。尝试使用反斜杠转义空格也不起作用。我看到使用ls "`cmd`"
有效。但是,如果我想将多个文件作为参数传递给ls
某些可能包含空格的文件,则这不起作用。
关于命令替换的手册也显得稀疏。https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html
更一般地说,如果 cmd 想要输出一个文件列表,然后可以使用反引号替换来替换该列表以供另一个命令使用,则 cmd 遵循的输出格式是什么?
答案1
我看到使用
ls "`cmd`"
有效。但是,如果我想将多个文件作为参数传递给 ls 并且其中一些可能包含空格,则这不起作用。
这是正确的。这与将命令存储在变量中是相同的问题(已讨论)例如这里),确实不能做得很好。我想到的选项是:
- 输出
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
find -exec ...
或者如果可以用它替换的话就使用cmd
。