我的 shell 环境的行为发生了变化:
早些时候,在粘贴函数定义时,例如
function exampleFunc {
echo hello
}
到 shell,它将显示为格式化并注册新的函数定义。
>
现在,由于某种原因,它在除第一行以外的每一行之前显示。
function exampleFunc {
>echo hello
>}
我发现包含 for 循环的函数现在无法注册。
这可能是什么解释?我怎样才能恢复到以前的模式?
Ubuntu 20.04
此更改发生在安装nushell之后,但可能无关。
这个跟你安装没关系
nushell
。它也不会阻止 shell 正常运行。是
>
shell辅助提示符(PS2
) 的默认值。Enter每当用户在未完成当前命令的情况下按下键后 shell 需要进一步输入时,就会显示辅助提示。只有当 shell 处于交互模式时才会发生这种情况。POSIX 标准是这样说的
PS2
:在您的具体示例中,函数定义是仍需要完成的命令。直到用户
}
在定义的末尾输入右花括号,shell 才能执行命令。如果 Readline 库禁用了“带括号的粘贴”,则在 shell中粘贴命令时,您还将获得辅助提示。
bash
默认情况下,启用括号粘贴模式,这意味着 shell 将一次性处理粘贴的文本块,而不是作为单独的行。通过将以下行添加到您的~/.inpturc
文件,可以禁用此行为(对于未来的 shell 会话):如果终端是“哑”或者如果您使用的 bash shell 版本早于 5.0,则括号粘贴模式也默认禁用。
不同的 shell 在
$PS2
.zsh
例如,shell 通过动态更新提示让您知道哪些命令当前未完成:...而
bash
shell 使用静态>
字符串:该
nushell
shell 似乎用作:::
类似 POSIX 的 shell 中的辅助提示符。但是,该nushell
shell 甚至不会尝试成为 POSIX shell。取消设置
PS2
变量bash
可能会导致混淆。例如,如果您认为您刚刚调用了一个长时间运行的命令,但实际上忘记了一个结束引号,您将不会有任何迹象表明 shell 正在等待您完成该命令。这
>
是一个称为辅助提示字符串的Bourne Shell 变量。来自 gnu.org:
Bourne Shell 变量
辅助提示字符串,
PS2
可以使用以下命令抑制它:
灵感来自https://superuser.com/a/1499801/217142
我不明白为什么我的 shell 会
>
作为辅助提示字符串引入。但是,正如 Kusalananda 所说,我遇到的问题与此无关(或安装 nushell)。相反,我提到的不起作用的 for 循环是由于我无意中将选项卡引入了我正在复制的编辑器中。这会导致 bash使用消息中断函数定义display all X possibilities
。要重现错误,我应该发布:
注意之前的
\s\t\t
( space-tab-tab )echo
。当我为这个问题简化这个时,我没有认识到原因。惨痛的教训!