当我在终端中输入单引号时,'
它会进入其他模式,并且命令不会执行。这是何模式?我们何时使用它?
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++ ls
newline 组成的命令。无法找到这样的可执行文件名(通常命令文件名应仅由字母数字字符以及下划线、破折号和点组成)。虽然文件名中确实可以包含特殊字符,但始终要避免这种情况。
笔记:您示例中所示的这种行为特定于 Bourne 类 shell,包括bash
、dash
(在 Ubuntu 上它符号链接到/bin/sh
)、ksh
和mksh
。csh
并且其衍生产品不会表现出如下行为:
$ tcsh
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%
然而,在交互模式下,csh
仍然会?
引发提示2当需要更多输入时:
$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3