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
是'with
和space'
。尝试使用反斜杠转义空间也不起作用。我看到使用ls "`cmd`"
作品。但是,如果我想将多个文件作为参数传递给ls
一些可能包含空格的文件,这将不起作用。
命令替换手册也显得稀少。https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html
更一般地说,如果 cmd 想要输出一个文件列表,然后可以使用反引号替换来替换这些文件以供另一个命令使用,那么它所遵循的输出格式是什么?
我看到使用
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
用它替换,请使用。
归档时间: |
|
查看次数: |
1488 次 |
最近记录: |