> 在 bash 中交互定义函数时出现的符号

> 在 bash 中交互定义函数时出现的符号

我的 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

...而bashshell 使用静态>字符串:

$ function foo {
> for arg do
>   printf '%s\n' "$arg"
> done
> }
$ foo a b c
a
b
c

nushellshell 似乎:::相当于 POSIX 类 shell 中的辅助提示符。然而,该nushellshell 甚至不尝试成为 POSIX shell。

取消PS2设置变量bash可能会导致混乱。例如,如果您认为刚刚调用了一个长时间运行的命令,但实际上忘记了右引号,则不会有任何迹象表明 shell 正在等待您完成该命令。

答案2

>是一个Bourne Shell 变量被称为辅助提示字符串

来自 gnu.org:

Bourne Shell 变量

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。当我简化这个问题时,我没有意识到原因。惨痛的教训!

相关内容