Почему мои сценарии ZSH распечатывают всю историю, но только в Ubuntu?

Я клонировал очень популярный набор точечных файлов для 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]
$

Есть идеи, что может вызвать такое несоответствие между двумя платформами? Я знаю, что они абсолютно одинаковы, я клонировал оба из одного и того же репо.


person aronchick    schedule 17.03.2015    source источник
comment
Оба работают с одной и той же версией zsh? zsh --version?   -  person Mr. Llama    schedule 17.03.2015
comment
Да - оба работают на zsh 5.0.5   -  person aronchick    schedule 17.03.2015
comment
Я бы проверил ваши псевдонимы и пользовательские функции, чтобы увидеть, не переопределяет ли что-то ls.   -  person Mr. Llama    schedule 17.03.2015


Ответы (2)


Итак, я обнаружил, в чем проблема, но не как ее решить (или почему это было сделано именно так).

Во-первых, благодаря этому (Как отлаживать команду Shell после настройки) вопрос о переполнении стека, я обнаружил, что вы можете выполнить zsh -x и заставить его распечатать буквально каждую строку каждой части вашей оболочки перед выполнением. В итоге получилось вот такая строчка:

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

Я понятия не имею, для чего это предназначено (похоже, он пытается распечатать подмножество предыдущей команды как часть командной строки, но почему он просто начинается с байта 7, мне не понятно), и это не так. по-видимому, используется где-либо еще. Я также не знаю, почему это работает (?) на Mac, а не на Ubuntu.

Комментирование этого решило это.

person aronchick    schedule 17.03.2015
comment
Похоже, проблема в том, что history $HISTCMD возвращает один элемент в MacOS X, но несколько элементов в Ubuntu. Не могли бы вы проверить это для меня? $HISTCMD должен содержать номер, соответствующий вашей текущей записи в истории. - person Mr. Llama; 17.03.2015
comment
Только что проверил, и кажется, что он получает список обоих. СТРАННЫЙ! - person aronchick; 19.03.2015

Я столкнулся с той же проблемой — эту же команду можно найти в ze-best-zsh- конфигурация. Поведение Ubuntu также происходит в OS X, если вы используете screen.

Расширяя ответ aronchick, я думаю, что здесь происходит две вещи.

"\e[1; ... \a" — это экранированная последовательность xterm для установки заголовка. Я думаю, что основная проблема заключается в том, что эта escape-последовательность почему-то неправильно обрабатывается в некоторых средах (например, Ubuntu или OS X под screen), поэтому вместо этого она отображается на терминале. Я не уверен, в чем именно заключается проблема, однако единственное реальное решение, которое я нашел, - это полностью удалить функцию set_running_app.

В моей системе (под управлением oh-my-zsh) я обнаружил дополнительную морщину, которая что команда history на самом деле имеет псевдоним fc -l 1. Я думаю, что это может быть полустандартный псевдоним в zsh, но одним из эффектов является то, что он всегда выводит полную историю, даже если передается номер записи истории. ($HISTCMD возвращает номер последней записи в истории, поэтому history $HISTCMD обычно возвращает только последнюю запись истории. Часть | cut -b7- удаляет сам номер записи, оставляя только команду.)

Таким образом, предположительно, эта команда предназначена для установки строки заголовка для текущей выполняемой программы, например. если вы запустите vi, в заголовке будет написано "vi" во время работы. Однако я не могу понять, для чего нужна часть $PWD:t:. Похоже, это было повреждено расширение zsh или что-то в этом роде.

person Adam    schedule 30.10.2015