看一下下面的演示:
[user@host ~]$ zsh
user@host:~/ > echo -n test
user@host:~/ > bash
[user@host ~]$ echo -n test
test[user@host ~]$
echo -n
是一个不打印尾随换行符的命令示例。我从同事那里得到了许多这样的命令(例如带有 json 输出的 curl),只想不加修改地运行。不幸的是,zsh 吞掉了它们的输出。但是 bash(事实上是 Linux 上的标准 shell,我所有的同事都在使用)却不会。我如何配置 zsh 使其像 bash 一样运行并打印输出?
答案1
默认情况下,嘚zsh -f
行为类似于以下内容——您可以通过调用不加载自定义设置的 shell 来检查这一点:
zsh$ echo -n test
test%
zsh$ echo test
test
zsh$
以反向视频形式%
打印的 表示 shell 添加了额外的换行符,以防止提示覆盖该行(在您的情况下似乎发生了这种情况)。
这是由默认设置的选项控制的PROMPT_SP
,手册(man zshoptions
)中对此进行了说明,如下所示:
尝试保留部分行(即未以换行符结尾的行),否则由于 PROMPT_CR 选项,该行将被命令提示符覆盖。此操作通过输出一些光标控制字符(包括一系列空格)来实现,当存在部分行时,这些字符会使终端换行到下一行(请注意,这仅在您的终端具有自动边距时才会成功,这是很常见的情况)。
当保留部分行时,默认情况下,您将在部分行的末尾看到一个反加粗字符:普通用户为“%”,root 为“#”。如果设置,shell 参数 PROMPT_EOL_MARK 可用于自定义部分行末尾的显示方式。
注意:如果未设置 PROMPT_CR 选项,则启用此选项将不起作用。默认情况下此选项处于启用状态。
长话短说,在你的配置文件中的某个地方(通常是~/.zshrc
和/etc/zsh/zshrc
,有关完整列表,请参阅启动/关闭文件)此选项未设置。因此,请找到有问题的行或手动重置选项:
setopt PROMPT_SP