让 zsh 像 bash 一样执行命令而不使用换行符

让 zsh 像 bash 一样执行命令而不使用换行符

看一下下面的演示:

[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

相关内容