jkt*_*vis 106 bash prompt zsh newlines
我有时会在各种应用程序中注意到这一点。我经常认为这是因为输出被提前取消(例如 ctrl+c)或类似的东西,而 zsh 正在填充一个新行字符。但是现在好奇心占据了我的心,因为它在 bash 中似乎没有做到这一点。
zsh

猛击

该Sequence程序是我在阅读 Java 认证时从书中提取的内容,只是想看看它是否可以编译和运行。我确实注意到它没有使用包/类中的println()方法System.out。相反,它使用普通的 old print()。
缺少换行符是我得到这个符号的原因吗?
Lei*_*iaz 101
是的,发生这种情况是因为它是“部分行”。并且默认情况下zsh 转到下一行以避免被 prompt 覆盖。
保留部分行时,默认情况下,您将在部分行的末尾看到一个反加粗体字符:普通用户为“%”,root 用户为“#”。如果设置,shell 参数 PROMPT_EOL_MARK 可用于自定义部分行结尾的显示方式。
Sté*_*las 38
这是zsh(现在fish也是)的一个特定功能,可以让您清楚地看到命令输出中未终止的行。
在传统的 shell 中,如果命令在最后一个换行符之后输出一些数据,或者换句话说,如果它使终端光标不在行首,则 shell 的下一个提示会附加到最后一个未终止的行如:
bash-4.4$ printf XXX
XXXbash-4.4$
Run Code Online (Sandbox Code Playgroud)
这会破坏提示,而且很容易错过XXX那里,特别是如果您有这样一个更高级的提示。它还会影响光标定位,从而在您四处移动光标时导致显示故障。
zsh解决这个问题,通过显示输出有一个带有%粗体和反向视频字符的未终止行,并在下一行的开头发出下一个提示:
zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$
Run Code Online (Sandbox Code Playgroud)
它通过%在每个命令的末尾(在每个提示之前)输出反向视频,然后是 79 个空格(假设一个 80 个字符宽的终端)、一个 CR 字符(导致光标返回到第一个字符的字符)来实现这一点列)和要擦除到行尾的序列(然后是提示)。
这样,如果有一个未终止的行,由于光标不在第一个位置,这 80 个字符将使光标移动到下一行(并%保持不变)。如果没有,那么那个%和那 79 个空格将在一行上,之后将被删除。
现在,这仅在终端确实换行时才有效(例如,在 之后将无法正常工作tput rmam)。如果你有一个慢速终端(比如在 9600 波特串行线上),你实际上可能会看到那些%被显示出来然后在每个命令之后被删除,所以zsh让你禁用该功能:
unsetopt prompt_cr prompt_sp
Run Code Online (Sandbox Code Playgroud)
这样,zsh表现得更像传统的 shell。
您还可以使用$PROMPT_EOL_MARK变量更改该标记。
小智 12
行尾的百分号 ( %) 表示缺少换行符 ( \n)。
例如,printf "foo"结果为foo%. 将换行符添加到字符串 中printf "foo\n"会产生foo。
%):要删除百分号,请在代码后附加; echo.
例子:
# Issue
$ print -n "foo"
foo%
# Solution
$ print -n "foo"; echo
foo
Run Code Online (Sandbox Code Playgroud)