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

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

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

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

来自man bash

PROMPTING

交互式执行时,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:~# string,当你输入命令时它会正常显示。 >PS2提示。 还有其他的, PS3用于select命令块, PS4用于使用set -x命令进行调试。 在这种情况下,我们对PS2更感兴趣。

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

 $ cat < 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 +换行符组成的命令。 找不到这样的可执行文件名(通常命令文件名应该只包含一个ascii字符串)。 虽然确实可以在其中包含包含特殊字符的文件名,但始终可以避免使用。

注意 :您的示例中显示的此类行为特定于类似Bourne的shell,包括bashdash (在Ubuntu上,它是符号链接到/bin/sh ), kshmkshcsh及其派生词不会以这种方式表现:

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

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

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

也可以看看:

  • 在哪种情况下PS2,PS3,PS4用作提示?
  • bash中<<,<<<和<<之间有什么区别?
  • 在终端中意味着什么?
  • 无法在终端中输入新命令 – 卡在“>”中
  • 在命令行结束时单独的反引号有什么影响?

shell只是在等待收盘报价。 当您输入它时,它将完全按照通常的方式执行,并尝试执行输入的命令。

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

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