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

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

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

$ ls `cmd`

我试过ls `echo 'with space'`。传递给的参数ls'withspace'。尝试使用反斜杠转义空格也不起作用。我看到使用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

相关内容