终端命令中“'”(撇号)的含义


11

由于某些奇怪的原因,我尝试使用“'”作为标识符中的单词分隔符,如下所示:

$ export foo'bar=1
> 
> ^C
$ 

结果如上所示,除非提示更改为“>”,否则系统显然在等待我的更多信息。如您所见,我必须使用ctrl-C才能逃脱。使用其他命令(例如,

$ ls foo'bar
$ mkdir foo'bar

我对所有这些的意义感到很好奇,这就是终端命令中特殊的含义“'”(实际上是如此特殊,以至于它甚至在id中也被分解了)。

另外:顺便说一句,我还想知道在类似Unix的系统和Windows系统下,文件和文件夹名称中的一组特殊字符或无效字符(以获取安全的公共子集)(尤其是所有这些非ASCII?)。

谢谢你,丹尼斯


在Linux世界中,除\ 0(空)和/以外的所有字符均被允许。但是,这并不意味着它们都是可取的。许多人认为最好避免使用对外壳有特殊含义的字符。如果您想了解Windows,请查阅Windows参考。
Scott Severance,2012年

Answers:


15

每当在任何shell命令中使用'字符时,它都是非常强大的字符。基本上,'(撇号)会禁用所有类型的转换或修改。它将把带有'标记的内容视为单个实体,即单个参数。绝对不会发生任何替代或扩展。

例:

 $ echo '$HOME'

会在输出中产生字符串$HOME本身,并且不会输出主目录的路径。由于单引号会阻止任何形式的扩展,因此替换和简单会将本身出现的任何内容视为简单参数。

如果要按原样使用撇号,则必须对其进行转义:

 $ mkdir foo\'bar

 $ cd foo\'bar

如果不进行转义,它将等待其对关闭,就像您在第一个示例中发生的那样。

因此,更正后,您的命令将是:

 $ export foo\'bar=1

注意: 正如Milan Todorovic所注意到的,这将是无效的,因为在这种情况下您不能使用撇号。


1
@ denis63,如果您需要查看答案,请接受答案:)
Rinzwind

7

字符'是特殊字符。您可以使用它标记不会更改的命令行输入部分(例如,不替换通配符)。例如:

$ ls 'bla*'
ls: cannot access bla*: No such file or directory

这意味着,论据lsbla*,不与开始的一切bla

获得>角色的原因是,必须使用一个不变的零件'来打开它,而'要闭合的零件上使用一个。

如果要'在文件夹名称中使用,则必须像这样对它进行转义:\'。因此,如果要列出名为的文件夹foo'bar,则应键入ls foo\'bar

哦,我不确定是否可以'在环境变量名称中使用。我认为您不能使用export foo\'bar=1

希望这可以帮助。


支持您对环境变量名称限制的观察。
Frantique

尚不能投票(askubuntu的新手),但是感觉到了。就像您说的那样检查了环境变量名称。(我自己没有考虑过如何打开/关闭定界符,这让我感到有些愚蠢,但是后来我将“'”视为真正的撇号,而不是单引号)。丹尼斯
丹尼斯2012年
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.