当我输入单引号时终端进入什么模式?

man*_*nta 11 command-line bash

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

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
Run Code Online (Sandbox Code Playgroud)

Zan*_*nna 30

shell 只是在等待结束语。当你输入它时,它会做它通常做的事情,并尝试执行输入的命令。

引号导致 shell 不解释特殊字符,这意味着不执行扩展。单引号完全禁止对特殊字符的所有解释。通常换行符分隔命令,但在这里您通过引用它们将换行符作为命令的一部分包含在内。

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


Ser*_*nyy 26

实际上,shell 要求提供完整的 command/expression,因此显示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 ``> ''.
Run Code Online (Sandbox Code Playgroud)

因此,从阅读文档中您可能会猜到,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
Run Code Online (Sandbox Code Playgroud)

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

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

在您的特定情况下,单引号意味着对单引号之间内容的字面解释。因此,正如 Zanna 所指出的,您正在输入一个由换行符 + ls+换行符组成的命令。找不到这样的可执行文件名(通常命令文件名应该只包含字母数字字符,加上下划线、破折号和点)。尽管文件名中确实可能包含特殊字符,但总是要避免。

注意:您的示例中显示的这种行为特定于 Bourne-like shell,包括bash, dash(在 Ubuntu 上它被符号链接到/bin/shksh、 和mkshcsh及其衍生产品不会以这种方式运行:

$ tcsh                                                    
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%  
Run Code Online (Sandbox Code Playgroud)

但是,在交互模式下,当需要更多输入时,csh仍将?作为prompt2出现:

$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3  
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 同时,zsh 非常友好地告诉您它在等待什么,如果您认为您的命令有效但忘记转义某些内容,这偶尔会很有用。 (3认同)