![> 在 bash 中交互定义函数时出现的符号](https://linux22.com/image/217948/%3E%20%E5%9C%A8%20bash%20%E4%B8%AD%E4%BA%A4%E4%BA%92%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0%E6%97%B6%E5%87%BA%E7%8E%B0%E7%9A%84%E7%AC%A6%E5%8F%B7.png)
我的 shell 环境的行为发生了变化:
早些时候,当粘贴函数定义时,例如
function exampleFunc {
echo hello
}
对于 shell,它将显示为格式化并注册新函数定义。
>
现在,由于某种原因,它在除第一行之外的每一行之前显示。
function exampleFunc {
>echo hello
>}
我发现包含 for 循环的函数现在无法注册。
对此可能有什么解释?我怎样才能恢复到之前的模式?
乌班图20.04
安装后发生此更改努谢尔,但也许无关。
答案1
这与你安装无关nushell
。它也不会阻止 shell 正常运行。
这>
是 shell 的默认值二次提示( PS2
)。当用户在Enter未完成当前命令的情况下按下按键后,每当 shell 需要进一步输入时,就会显示辅助提示符。仅当 shell 处于交互模式时才会发生这种情况。
POSIX 标准说这个关于PS2
:
每次用户
<newline>
在交互式 shell 中输入 before 完成命令行时,该变量的值都应进行参数扩展并写入标准错误。默认值为>
。
在您的具体示例中,函数定义是仍需要完成的命令。直到用户}
在定义末尾输入右大括号 时,shell 才能执行该命令。
如果您是,您还会收到第二个提示粘贴bash
如果 Readline 库禁用了“括号粘贴”,则在 shell 的命令中。默认情况下,启用括号粘贴模式,这意味着 shell 将一次性处理粘贴的文本块,而不是单独的行。通过将以下行添加到~/.inpturc
文件中可以禁用此行为(对于将来的 shell 会话):
set enable-bracketed-paste off
如果终端是“哑”的或者您使用的 bash shell 版本早于 5.0,则默认情况下也会禁用括号粘贴模式。
不同的 shell 中可能有不同的默认值$PS2
。例如, shellzsh
通过动态更新提示让您知道当前未完成哪个命令:
$ function foo {
function> for arg do
function for> print -r $arg
function for> done
function> }
$ foo 1 2 3
1
2
3
...而bash
shell 使用静态>
字符串:
$ function foo {
> for arg do
> printf '%s\n' "$arg"
> done
> }
$ foo a b c
a
b
c
该nushell
shell 似乎:::
相当于 POSIX 类 shell 中的辅助提示符。然而,该nushell
shell 甚至不尝试成为 POSIX shell。
取消PS2
设置变量bash
可能会导致混乱。例如,如果您认为刚刚调用了一个长时间运行的命令,但实际上忘记了右引号,则不会有任何迹象表明 shell 正在等待您完成该命令。
答案2
这>
是一个Bourne Shell 变量被称为辅助提示字符串。
来自 gnu.org:
Bash 使用某些 shell 变量的方式与 Bourne shell 相同。在某些情况下,Bash 会为变量分配默认值。
辅助提示字符串,PS2
辅助提示字符串。默认值为“>”。
PS2
在显示之前以与 PS1 相同的方式展开。
可以使用以下命令抑制它:
unset PS2
灵感来自https://superuser.com/a/1499801/217142
我不明白为什么我的 shell 引入了>
辅助提示字符串。然而,正如 Kusalananda 所说,我遇到的问题与此(或安装 nushell)无关。相反,我提到的不起作用的 for 循环是由于我无意中将选项卡引入了我从中复制的编辑器。这会导致 bash中断函数定义有一条display all X possibilities
消息。
要重现错误,我应该发布:
function exampleFunc {
echo hello;
}
请注意\s\t\t
(空格-制表符-制表符) 前echo
。当我简化这个问题时,我没有意识到原因。惨痛的教训!