Почему мои 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]
$

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

2 ответа

Решение

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

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

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

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

Комментируя это, решил это.

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

Продолжая ответ Арончика, я думаю, что здесь происходит две вещи.

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

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

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

Другие вопросы по тегам