当我输入单引号时,终端会采用什么模式?
当我在终端中输入单引号时,它会进入其他某种模式,并且命令不会执行。 这种模式是什么,我们什么时候使用它?
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,包括bash
, dash
(在Ubuntu上,它是符号链接到/bin/sh
), ksh
和mksh
。 csh
及其派生词不会以这种方式表现:
$ 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不解释特殊字符,这意味着不执行扩展。 单引号完全禁止对特殊字符的所有解释。 通常情况下,换行符会分隔命令,但是在这里您通过引用它们将换行符作为命令的一部分包含在内。
由于没有
这样的命令,因此找不到它。