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

den*_* 63 11 command-line syntax

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

$ export foo'bar=1
> 
> ^C
$ 
Run Code Online (Sandbox Code Playgroud)

结果如上所示,id est提示更改为“>”,系统显然在等待我的更多信息。如您所见,我必须按 ctrl-C 才能逃脱。使用其他命令也会发生同样的情况,例如

$ ls foo'bar
$ mkdir foo'bar
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你,丹尼斯

Fra*_*que 15

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

例子:

 $ echo '$HOME'
Run Code Online (Sandbox Code Playgroud)

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

如果您想按原样使用撇号,则必须将其转义:

 $ mkdir foo\'bar

 $ cd foo\'bar
Run Code Online (Sandbox Code Playgroud)

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

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

 $ export foo\'bar=1
Run Code Online (Sandbox Code Playgroud)

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


Mil*_*vic 7

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

$ ls 'bla*'
ls: cannot access bla*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这意味着对于lswasbla*而不是所有以 开头的参数bla

之所以得到>字符,是因为必须使用一个'用于打开和'用于关闭的部分,并且不会更改。

如果要'在文件夹名称中使用,则必须像这样转义它:\'. 所以如果你想列出命名的文件夹,foo'bar你应该输入ls foo\'bar.

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

希望这可以帮助。