为什么我有时会在终端中反复提示“>”?

Dis*_*ame 19 command-line shell bash prompt

好吧,当我以错误的方式运行某些命令时,(拼写错误等)终端输出这个:>而不是computername:workingfolder username$,当我输入时,它是这样的:

>

>

>
Run Code Online (Sandbox Code Playgroud)

如果我按回车键 3 次,那就是这样。

Joh*_*024 43

> 是默认的继续提示。如果您之前输入的内容具有不平衡的引号,您将看到该提示。

例如,在命令行上键入单引号,后跟几个enter键:

$ '
> 
> 
> 
Run Code Online (Sandbox Code Playgroud)

继续提示将出现,直到您

  • (a) 用右引号完成命令

    或者

  • (b) 输入Ctrl+D以完成输入,此时 shell 将响应有关不平衡引号的错误消息,

    或者

  • (c) 键入Ctrl+C这将中止您输入的命令。

这有什么用

有时,您可能想要输入一个包含嵌入新行的字符串。你可以这样做:

$ paragraph='first line
> second line
> third line
> end'
Run Code Online (Sandbox Code Playgroud)

现在,当我们显示该 shell 变量时,您可以看到提示消失了,但换行符保留了:

$ echo "$paragraph"
first line
second line
third line
end
Run Code Online (Sandbox Code Playgroud)


Mic*_*mer 16

如果您的命令中有未封闭的引号,就会发生这种情况。那是这样的:

$ echo "test here
>
>
...
Run Code Online (Sandbox Code Playgroud)

您可以通过关闭引用来退出该模式(写一个"',或任何您的开放引用)。它也可以是大括号分隔的块、部分完整for-dowhile-do循环或某些其他结构。您也可以按Ctrl-C取消此命令(然后按Up进行修改)。

参数历史扩展发生在您没有预料到的地方时,有时会发生这种情况而没有明显丢失的引号。


>是您的PS2(“辅助提示”)值。您可以将其更改为其他内容以提醒您发生了什么:

PS2="Unclosed >"
Run Code Online (Sandbox Code Playgroud)

在您的.bashrc遗嘱中将其打印Unclosed >在每一行的开头。


Mr *_*ter 7

除了其他答案之外,当您键入 a\作为一行的最后一个字符时,您还会收到继续提示。

  • (对我来说,这通常是偶然发生的,因为反斜杠非常接近 Enter 键。) (5认同)

200*_*ess 7

答案在于Bash 参考手册中的这个神秘提及:

5.1 Bourne Shell 变量

[...]

  • PS1: 主要提示字符串。默认值为“ \s-\v\$”。有关在显示之前展开的转义序列的完整列表,请参阅打印提示PS1
  • PS2: 辅助提示字符串。默认值为“ >”。

……其次是

6.3.3 交互式 Shell 行为

  1. BashPS1在读取命令的第一行PS2之前展开并显示,在读取多行命令的第二行和后续行之前展开并显示。

因此,>如果您按Enter并且 Bash 确定命令不完整,则会出现提示。那可能是因为:

  • 换行之前的字符是一个\,它被当作一个行继续
  • 您有一个不完整的字符串(不匹配的引号或未终止的 here-doc)或其他一些不匹配的分隔符,例如$(), (), ``
  • 您已经启动了一个函数定义、一个for循环、一个while循环或一个case.

如果由于无意的输入错误而看到次要提示,请点击ControlC以返回到主要提示。


Sid*_*idJ 6

shell 等待你完成命令。也许某处有一个未关闭的引号,或者它认为您正在启动一个“for”循环并等待用户完成输入