没有引号的文件中需要转义哪些字符?


12

我有执行bash命令的基于浏览器的shell /终端,正在转义空格,但事实证明括号也需要转义。对于不在引号中的文件名,还需要转义其他哪些字符?


尚不清楚您要做什么。自动补全与什么有关?
Michael Vehrs

@MichaelVehrs我mv filename filename-foo在bash中有命令,除了空格和括号外,还需要转义哪些字符?
jcubic

@MichaelVehrs删除了自动完成功能。
jcubic

基本上,所有shell元字符,例如空格,shell glob,历史事件。因此,您应该引用整个文件名,而不要转义单个字符:mv "$filename" "$newname"
Michael Vehrs

@MichaelVehrs我知道用引号可以解决转义的问题,但是我需要使用不带引号的文件名。我有终端模拟器,当用户不使用引号时它应该可以工作。
jcubic

Answers:


22

一种简单的解决方案是在单引号(')的开头加上另一个单引号的结尾,然后用'4个字符的序列替换文件名中的每个字符'\''。所有字符都在单引号引起的字符串中失去了特殊的含义,除了'标记字符串结尾的本身。该序列'\''以单引号文字结束,紧接着是带引号的单引号,并打开一个新的单引号文字。因此文件名

This file's name has some weird characters!
Will you manage to escape them?

可以引用如下:

somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'

双引号具有更复杂的转义规则,并且!如果激活了历史替换功能,则不允许您添加感叹号,因此我将不再赘述。

另一种方法是用反斜杠保护字符。这适用于除换行符之外的所有字符;对于换行符,将其放在单引号(或双引号)内是唯一的解决方案。如果要最小化反斜杠的数量以向用户显示加引号的名称,则可以将其限制在需要反斜杠的位置;但是,省略的反斜杠越多,您越有可能忘记需要的反斜杠。字母,数字和非ASCII字符始终可以使用¹。如果不确定,请引用空白和标点符号。

对于典型的shell(ksh,bash或zsh),至少在某些情况下,需要引用以下字符。

  • 空格(空格,制表符,换行符-请记住,换行符不能用反斜杠引起来)。
  • ! —历史扩展。
  • " — Shell语法。
  • #—在空格前添加注释;zsh通配符。
  • $ — Shell语法。
  • & — Shell语法。
  • ' — Shell语法。
  • (—即使在单词中间:ksh扩展的glob(也可以在bash和zsh中使用);zsh通配符。
  • )(请参阅(
  • * — sh通配符。
  • , -仅在括号内扩展。
  • ; — Shell语法。
  • < — Shell语法。
  • = —在zsh中,当它位于文件名的开头(使用PATH查找扩展文件名)时。
  • > — Shell语法。
  • ? — sh通配符。
  • [ — sh通配符。
  • \ — Shell语法。
  • ] -您可以不加报价而逃脱。
  • ^—历史扩展;zsh通配符。
  • ` — Shell语法。
  • { -撑杆扩展。
  • | — Shell语法。
  • } -需要在zsh中转义,如果没有匹配的开括号,其他shell会更宽松。
  • ~—在文件名开头的主目录扩展;zsh通配符;最后一个字符时始终保持安全。

有时可能需要一些其他字符的特殊处理:

  • -对于shell来说不是特殊的,但是当它在命令参数的开头时,它指示一个选项。它不能用引号保护,因为特殊处理在命令中,而不在外壳中。为了保护以开头的文件名-,您可以将./其放在前面-这样,它仍然是相同的文件,但是该参数不再以该开头-
  • .本身并不特殊,但是*默认情况下,斑点文件不包含在全局文件中。
  • :对于shell来说不是特别的,但是一些命令会专门对其进行解析,例如,指示一个远程文件(hostname:filename)。请查阅命令文档,以了解如何处理包含冒号的文件名。

¹ 除非用户配置了备用历史记录扩展字符。一些外壳允许这样做。这是使用单引号而不是反斜杠的另一个原因。


换行符(至少LF仅换行符)在某些shell中可以用反斜杠引起来。
iBug

@iBug否。在任何类似sh的shell中,反斜杠+换行符都会扩展为空字符串,而不是换行符。
吉尔斯(Gilles)'所以

这是一个很好的答案,谢谢。是否有指向“官方”提供此信息的链接?
slashmais

1
@slashmais什么信息?Shell语言的语法在各种手册和规范中都“正式”可用,但是从那里找出要引用哪些字符的地方并不完全简单。
吉尔斯(Gilles)'所以

1
我也发现了这一点:tecmint.com/manage-linux-filenames-with-special-characters-它不像您的列表那么紧凑,但是有很多示例。(当主题涉及字符时
顺便说一句
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.