我有时在各种应用程序中注意到这一点。我经常认为这是因为输出被提前取消(例如 ctrl+c)或类似的东西,并且 zsh 正在填充新行字符。但现在好奇心战胜了我,因为 bash 中似乎没有这样做。
桀骜
巴什
该Sequence
程序是我在阅读 Java 认证时从一本书中提取的,只是想看看它是否可以编译和运行。我确实注意到它不使用包/类println()
中的方法。System.out
相反,它使用普通的旧print()
.
缺少换行符是我得到这个符号的原因吗?
答案1
是的,发生这种情况是因为它是“部分线路”。并且默认情况下zsh 转到下一行以避免提示覆盖它。
当保留部分行时,默认情况下,您将在部分行的末尾看到一个反色+粗体字符:“%”表示普通用户,“#”表示 root。如果设置,shell 参数 PROMPT_EOL_MARK 可用于自定义部分行结尾的显示方式。
答案2
zsh
这是(现在也是)的一个特定功能fish
,可以让您清楚地看到命令输出中未终止的行。
在传统 shell 中,如果命令在最后一个换行符之后输出一些数据,或者换句话说,如果它离开终端光标不是在该行的开头,shell 的下一个提示符最终会附加到最后一个未终止的行,如下所示:
bash-4.4$ printf XXX
XXXbash-4.4$
这会破坏提示符,并且很容易错过它,XXX
特别是如果您有比这更奇特的提示符。它还会影响光标定位,从而在移动光标时导致显示故障。
zsh
解决这个问题,通过显示输出有一个未终止的行,其中有一个%
粗体和反白的字符,并在下一行的开头发出下一个提示:
zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$
%
它通过在末尾输出反向视频来实现这一点每一个命令(在每个提示之前),但后跟 79 个空格(假设有 80 个字符宽的终端)、一个 CR 字符(导致光标返回到第一列的字符)以及要擦除到行尾的序列(然后是提示)。
这样,如果有未终止的行,由于光标不在第一个位置,这 80 个字符将使光标移动到下一个线(并且%
会保留)。如果没有,那么该空格%
和那 79 个空格将在一行上,之后将被删除。
现在,只有当终端确实换行时才有效(例如,在 后将无法正常工作tput rmam
)。如果您的终端速度较慢(例如在 9600 波特串行线路上),您实际上可能会看到这些内容%
正在显示,然后在每个命令后被删除,因此zsh
让您禁用该功能:
set +o prompt_cr +o prompt_sp
这样,zsh
其行为就更像传统的 shell。
您还可以使用$PROMPT_EOL_MARK
变量更改该标记。
答案3
解释:
行尾的百分号 ( %
) 表示缺少换行符 ( \n
)。
例如,printf "foo"
结果为foo%
.将换行符添加到字符串 中printf "foo\n"
会产生foo
。
如何删除百分号( %
):
要删除百分号,请在代码后附加; echo
.
例子:
# Issue
$ print -n "foo"
foo%
# Solution
$ print -n "foo"; echo
foo