【问题标题】:Why would my ZSH scripts print out all history, but on Ubuntu only?为什么我的 ZSH 脚本会打印出所有历史记录,但仅在 Ubuntu 上?
【发布时间】:2015-05-20 06:37:15
【问题描述】:

我已经为 ZSH 克隆了一组非常流行的点文件,你可以在这里查看 repo:https://github.com/aronchick/dotfiles

在 MacOS X (Yosemite) 上,它运行良好,完全符合预期。另一方面,在 Ubuntu 上,它会在执行每个命令之前重复我的整个历史记录。例如:

在 Mac 上:

# aronchick at mbp.com in ~/Public [10:22:01]
$ ls
Drop Box

# aronchick at mbp.com in ~/Public [10:22:03]
$

在 Ubuntu 14.04 上:

# aronchick at ub.mbp.com in ~/Public [10:23:35]
$ ls -la

[100+ lines of history]
 git submodule init
 ls -la
 cd ..
 ls -la
 cd ..
 ls
 ls -la total 8
drwxr-x---  2 aronchick wheel 4096 Mar 17 10:23 .
drwxr-xr-x 25 aronchick wheel 4096 Mar 17 10:23 ..
-rw-r--r--  1 aronchick wheel    0 Mar 17 10:23 DropBox

# aronchick at ub.mbp.com in ~/Public [10:23:39]
$

知道什么会导致两个平台之间出现这种差异吗?我知道它们完全一样,我已经从完全相同的 repo 中克隆了它们。

【问题讨论】:

  • 是否都运行相同的 zsh 版本? zsh --version?
  • 是的 - 都运行 zsh 5.0.5
  • 我会检查你的别名和用户定义的函数,看看是否有东西覆盖了ls

标签: ubuntu zsh oh-my-zsh


【解决方案1】:

好的,所以我发现了问题所在,但不知道如何解决它(或者为什么这样做)。

首先,感谢这个 (How to debug Shell command after customization) 堆栈溢出问题,我发现您可以执行 zsh -x 并在执行之前将其打印出您的 shell 每一部分的每一行。最终,它归结为这一行:

function set_running_app {
  echo -ne "\e]1; $PWD:t:$(history $HISTCMD | cut -b7- ) \a"
}

我不知道这是要做什么(它似乎试图打印出上一个命令的子集作为命令行的一部分,但为什么它只是从第 7 个字节开始我无法理解),而且它似乎没有在其他任何地方使用。我也不知道为什么它在 Mac 上工作(?)而不是在 Ubuntu 盒子上。

评论这个问题解决了。

【讨论】:

  • 问题似乎是history $HISTCMD 在 MacOS X 上返回一个项目,但在 Ubuntu 下返回多个项目。你能帮我验证一下吗? $HISTCMD 应该包含一个对应于您当前历史记录条目的数字。
  • 刚刚检查过,它似乎正在检索两者的列表。奇怪!
【解决方案2】:

我遇到了同样的问题——同样的命令可以在ze-best-zsh-config 中找到。如果您正在运行screen,Ubuntu 行为也会在 OS X 上发生。

扩展 aronchick 的答案,我认为这里发生了两件事。

"\e[1; ... \a" 是一个xterm escape sequence 来设置标题栏。我认为核心问题是这个转义序列在某些环境(例如screen 下的 Ubuntu 或 OS X)中以某种方式无法正确处理,因此它会呈现到终端。不过,我不确定这里的确切问题是什么,我找到的唯一真正的解决方案是完全删除 set_running_app 函数。

在我的系统上(运行oh-my-zsh)我发现了一个额外的问题,那就是history 命令实际上是fc -l 1 的别名。我认为这可能是 zsh 下的半标准别名,但一个效果是它总是打印出完整的历史记录,即使传递了历史记录条目号也是如此。 ($HISTCMD 返回历史记录中的最后一个条目号,因此history $HISTCMD 通常只会返回最后一个历史记录条目。| cut -b7- 部分会删除条目号本身,只留下命令。)

所以推测该命令旨在将标题栏设置为当前正在执行的程序,例如。如果你运行vi,标题栏会在运行时显示“vi”。不过,我无法弄清楚$PWD:t: 部分的用途。看起来可能是 zsh 扩展被损坏了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2019-04-30
    • 2020-10-06
    相关资源
    最近更新 更多