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

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

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

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

结果如上所示,即是提示符变为“>”,系统显然在等待我提供更多信息。如您所见,我必须按 ctrl-C 退出。使用其他命令时也会发生同样的情况,例如

$ ls foo'bar
$ mkdir foo'bar

我对这一切的意义感到很好奇,那就是“'”在终端命令中具有什么特殊含义(事实上它非常特殊,甚至在 id 内部也被拆开)。

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

谢谢你,丹尼斯

答案1

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

例子:

 $ echo '$HOME'

将在输出中生成字符串$HOME本身,而不会打印到您的主目录的路径。由于单引号阻止任何类型的扩展,因此替换和简单将任何存在的内容视为本身的简单参数。

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

 $ mkdir foo\'bar

 $ cd foo\'bar

如果没有转义,它将等待它的对被关闭,就像在第一个例子中发生的那样。

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

 $ export foo\'bar=1

笔记: 正如米兰·托多罗维奇(Milan Todorovic)注意到的,这是无效的,因为在这种情况下不能使用撇号。

答案2

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

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

这意味着争论的lsbla*而不是 以 开头的一切bla

之所以要获得>角色,是因为必须用一个'来开启,一个'来关闭不会改变的部分。

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

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

希望这可以帮助。

相关内容