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

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

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

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

答案1

shell 只是在等待结束的引号。当您输入它时,它将执行其通常所做的操作,并尝试执行输入的命令。

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

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

答案2

实际上,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 指出的那样,您正在输入一个由 newline++ lsnewline 组成的命令。无法找到这样的可执行文件名(通常命令文件名应仅由字母数字字符以及下划线、破折号和点组成)。虽然文件名中确实可以包含特殊字符,但始终要避免这种情况。

笔记:您示例中所示的这种行为特定于 Bourne 类 shell,包括bashdash(在 Ubuntu 上它符号链接到/bin/sh)、kshmkshcsh并且其衍生产品不会表现出如下行为:

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

然而,在交互模式下,csh仍然会?引发提示2当需要更多输入时:

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

也可以看看:

相关内容