为什么我的 ZSH 脚本会打印出所有历史记录,但只打印 Ubuntu?

Why would my ZSH scripts print out all history, but on Ubuntu only?

我已经为 ZSH 克隆了一组非常流行的点文件,您可以在此处查看存储库: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]
$

知道是什么导致了两个平台之间的差异吗?我知道它们完全一样,我从完全相同的存储库中克隆了两者。

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

首先,多亏了这个 (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 框上起作用(?)。

评论解决了这个问题。

我 运行 遇到了同样的问题 -- 同样的命令可以在 ze-best-zsh-config 中找到。 Ubuntu 行为也会发生在 OS X 如果你是 运行ning screen.

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

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

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

所以大概这个命令是为了将标题栏设置为当前正在执行的程序,例如。如果你 运行 vi 标题栏会显示 "vi" 而它是 运行ning。不过,我无法弄清楚 $PWD:t: 部分的用途。看起来可能是 zsh 扩展损坏了或者什么的。