对于文件名,我知道您必须使用双引号或反斜杠在文件名中包含空格。
喜欢mkdir "I like coffee"
是一样的mkdir I\ like\ coffee
现在,当您尝试在文件名中包含 $ 时,您必须使用反斜杠
喜欢mkdir \$dollar
我想知道除了空格和美元符号之外,在命名文件时还必须使用转义字符之外的其他字符是什么?
我找到了?并且 * 工作正常,所以我想知道还有哪些其他字符是这样的。
答案1
Unix 文件名可以包含任何字符(除了“/”或“\0”),所以这实际上是一个 shell 问题;需要转义的元字符列表取决于 shell 以及 shell 的具体配置。您似乎正在使用 bash;如果 ? 其他 shell 将会失败或 * glob 表达式不加引号:
$ mkdir test && cd test
$ ls
$ touch *foo
$ ls
*foo
$ exec zsh
% touch *bar
zsh: no matches found: *bar
% ls
*foo
%
bash 可以设置 failedglob shell 选项,使其在这方面的行为与 zsh 类似。一般来说,引用所有内容,或者更好的是,不要将元字符(甚至空格)放入 unix 文件名中,因为该路径可能导致rm -rf
调用破坏整个目录树,或其他随机失败(文件-i
被作为参数读取)或shell 代码中的安全问题。
答案2
您还没有编写您感兴趣的 shell。GNU Parallel 引用 中的任何字符串ash bash csh dash fdsh fish fizsh ksh ksh93 mksh pdksh posh rbash rc rush rzsh sash sh static-sh tcsh yash zsh
。它们各自需要的字符串引用略有不同。有关详细信息,请参阅中的“sub shell_quote_scalar”http://git.savannah.gnu.org/cgit/parallel.git/tree/src/parallel
核心线路是:
- bash-family: s/[\002-\011\013-\032\#\?`(){}[]\^*\<\=>\~\|\; \"!\$\&\'\202-\377]/\$&/go; s/[\n]/'\n'/go
- csh-family: s/[\002-\011\013-\032\#\?`(){}[]\^*\<\=>\~\|\; \"!\$\&\'\202-\377]/\$&/go; s/[\n]/"\\n"/go
- rc: s/'/''/g; s/[\n\002-\011\013-\032\#\?`(){}[]\^*\<\=>\~\|\; \"!\$\&\'\202-\377]+/'$&'/go
对于某些 shell,这引用的字符多于该特定 shell 所需的字符,但这些字符可能需要在其他 shell 中引用。例如 '=' 在 bash 中不需要引用,但在 zsh 中需要引用:
bash$ echo =wc
=wc
zsh% echo =wc
/usr/bin/wc
zsh% echo \=wc
=wc