输入单引号时,终端进入哪种模式?


11

当我'在终端中输入单引号时,它将进入其他模式,并且命令不执行。什么是此模式?何时使用?

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#

30
为什么要以root身份运行?
Zanna

13
您的终端处于与以前相同的模式-您的外壳处于不同的模式(等待与另一个字符串完成'
ohno

Answers:


26

实际上,shell要求输入完整的命令/表达式,因此显示PS2提示字符串。

来自man bash

提示

当以交互方式执行时,bash在准备读取命令时显示主要提示PS1, 在需要更多输入来完成命令时显示次要提示PS2。

在此之前:

  PS2    The value of this parameter is  expanded
          as  with  PS1  and used as the secondary
          prompt string.  The default is ``> ''.

因此,正如您从阅读文档中可能会猜到的那样,shell具有多个具有不同用途的提示。该PS1提示是你的root@sai:~#字符串,当你输入命令通常出现。>PS2提示。还有其他功能:PS3用于select命令块和PS4使用set -x命令进行调试。在这种情况下,我们对会更感兴趣PS2

shell可以通过多种方式显示PS2提示(并且可能需要在新行上完成命令)。执行here-doc重定向时会使用相同的提示(在此示例中,看到终止字符串时,命令被视为完整EOF):

$ cat <<EOF
> line one
> line two
> EOF
line one
line two

通常,可以通过添加\和即时(!)换行符来延续冗长的命令,这将导致出现相同的提示:

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World

当管道,逻辑运算符或特殊关键字出现在命令行的换行符之前时,在输入所有最终语句之前,该命令也被认为是不完整的:

$ echo Hello World | 
> wc -l
1

$ echo Hello World &&                                                                                                    
> echo "!"
Hello World
!

$ for i in $(seq 1 3); do
> echo "$i"
> done
1
2
3 

$ if [ -f /etc/passwd ]
> then
>     echo "YES"
> fi
YES

在您的特殊情况下,单引号意味着对单引号之间的含义的字面解释。因此,正如Zanna所指出的,您正在输入一个包含换行符+ ls+换行符的命令。找不到这样的可执行文件名(通常命令文件名应仅由字母数字字符以及下划线,破折号和点组成)。尽管确实可以使用其中包含特殊字符的文件名,但始终避免这样做。

注意:示例中所示的行为特定于类Bourne的shell,包括bashdash(在Ubuntu上符号链接到/bin/shksh,和mkshcsh及其派生词的行为不这样:

$ tcsh                                                    
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%  

但是,在交互模式下,当需要更多输入时,它csh仍将显示?提示2

$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3  

也可以看看:


链接What's the difference between <<, <<< and < < in bash?离线/错误。
Tico

@Tico感谢修复。答案是用每秒Internet速度的海龟来写的,这仅导致部分复制了链接。立即修复
Sergiy Kolodyazhnyy

3
同时,zsh非常友好,可以实际告诉您它正在等待什么,如果您认为您的命令有效但忘了转义某些内容,这有时会很有用。
凯文(Kevin)

30

外壳程序只是在等待结束报价。当您输入它时,它将执行通常的操作,并尝试执行输入的命令。

引号使外壳程序不解释特殊字符,这意味着不执行扩展。单引号完全禁止对特殊字符的所有解释。通常,换行符用于分隔命令,但是在此您通过引用引号将换行符包括在命令中。

由于没有这样的命令<newline>ls<newline>,因此找不到。

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.