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。
在那之前一点:
Run Code Online (Sandbox Code Playgroud)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
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/sh
)ksh
、 和mksh
。csh
及其衍生产品不会以这种方式运行:
$ 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)