【发布时间】:2011-08-26 09:27:54
【问题描述】:
我经常有一些名字很奇怪的文件,比如/foo/bar * baka/waka xoxotinh(|).mp3。为了正确引用文件,用任意语言转义这个东西的正确方法是什么?
【问题讨论】:
-
我可以建议将 bash 重新标记为 sh 因为这适用于所有 Bourne 类型的 shell?当您使用它时,从 linux 到 unix,因为它适用于独立于 Unix 风格的 shell?
我经常有一些名字很奇怪的文件,比如/foo/bar * baka/waka xoxotinh(|).mp3。为了正确引用文件,用任意语言转义这个东西的正确方法是什么?
【问题讨论】:
使用\转义每个保留字符:
/foo/bar\ \*\ baka/waka\ \*\ xoxotinh\(\|\).mp3
或者像这样用引号括起来:
"/foo/bar * baka/waka * xoxotinh(|).mp3"
【讨论】:
您可以通过在'' 中包含整个路径或通过\ 转义单个“怪异”字符来转义它。
这并不总是一件容易的事,所以如果您在 bash 提示符下直接执行此操作,那么只需使用 TAB 完成路径 - bash 会为您转义“奇怪”字符。
下面是 bash 如何逃脱它:
cd /foo/bar\ \*\ baka/waka\ xoxotinh\(\|\).mp3/
注意:我通过以下方式创建了路径:
mkdir -p '/foo/bar * baka/waka xoxotinh(|).mp3'
【讨论】:
在任意语言中,它完全取决于该语言及其引用约定。在我熟悉的大多数语言中,您的示例文件名并不是特别有问题,除了在 shell 脚本中;在 sh 和衍生物中,使用单引号来表示这类事情。
【讨论】:
您需要在"asd * sdd||ss.mp3" 等引号之间添加文件名,或转义字符。转义意味着您需要在每个无效字符前添加\。
例如,在 php 中你有 http://www.php.net/manual/en/function.escapeshellarg.php
【讨论】:
在 BASH 中,您可以使用双引号去除 * 和 ? 的通配含义。反引号有点麻烦。你必须把它们加倍。
事实上,您可以在 Bash 中的任何非字母数字字符前面简单地添加一个反斜杠tick,并且非常安全。这在 Linux 上的 Bash 中运行得非常好:
newFileName=$(echo -E "$fileName" | sed 's/[^[:alnum:]]/\\/g')
【讨论】:
除了用反斜杠引用每个shell 元字符 和空格外,没有通用 解决方案。如果您使用“单引号”进行引用,则名称中包含单引号会出现问题。如果您使用“双引号”引用,则名称中包含双引号和美元符号会出现问题。当然也有包含两者的名称...但是您可以使用不同的引用样式引用部分名称:
ls "name with spaces & a single quote->'"' and name with "quotes" and $'
注意第二个双引号如何结束第一部分,下一个字符是引用其余部分的单引号。那里!引用了一个包含两个引号的名称!一旦 shell 执行了 引号删除(总是最后),ls 将会看到
name with spaces & a single quote->' and name with "quotes" and $
作为单个参数。
【讨论】: