Я подумал, что, возможно, проблема связана с моей версией zsh, поэтому я очистил пакет zsh
и скомпилировал его из исходного кода:
% sudo aptitude install git-core gcc make autoconf yodl libncursesw5-dev texinfo
% git clone git://zsh.git.sf.net/gitroot/zsh/zsh
% cd zsh
% git checkout zsh-5.3.1
% ./Util/preconfig
% ./configure --build=x86_64-linux-gnu \
--prefix=/usr \
--includedir=/usr/include \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--sysconfdir=/etc \
--localstatedir=/var \
--libdir=/usr/lib/x86_64-linux-gnu \
--libexecdir=/usr/lib/x86_64-linux-gnu \
--bindir=/bin \
LDFLAGS="-Wl,--as-needed -g" \
--enable-maildir-support \
--enable-etcdir=/etc/zsh \
--enable-function-subdirs \
--enable-site-fndir=/usr/local/share/zsh/site-functions \
--enable-fndir=/usr/share/zsh/functions \
--with-tcsetpgrp \
--with-term-lib="ncursesw tinfo" \
--enable-cap \
--enable-pcre \
--enable-readnullcmd=pager \
--enable-custom-patchlevel=Debian \
--enable-additional-fpath=/usr/share/zsh/vendor-functions,/usr/share/zsh/vendor-completions \
--disable-ansi2knr
Я нашел зависимости и параметры конфигурации, прочитав INSTALL
, а также этот текст, найденный в Google:
https://gist.github.com/nicoulaj/715855
… и глядя на то, как разработчики Ubuntu скомпилировали последние пакеты zsh
:
https://launchpadlibrarian.net/280509421/buildlog_ubuntu-yakkety-amd64.zsh_5.2-5ubuntu1_BUILDING.txt.gz
Были некоторые опции, которые были написаны дважды, или не были распознаны zsh, поэтому я их удалил.
Значение, которое разработчики Ubuntu присвоили LDFLAGS
, похоже, не работало на моей машине, поэтому я скопировал
тот из сути на Github. Параметры, которые я оставил, описаны в ./configure --help
:
--build=BUILD configure for building on BUILD [guessed]
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--includedir=DIR C header files [PREFIX/include]
--mandir=DIR man documentation [DATAROOTDIR/man]
--infodir=DIR info documentation [DATAROOTDIR/info]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--libdir=DIR object code libraries [EPREFIX/lib]
--libexecdir=DIR program executables [EPREFIX/libexec]
--bindir=DIR user executables [EPREFIX/bin]
LDFLAGS linker flags, e.g. -L if you have libraries in a
nonstandard directory
--enable-maildir-support
enable maildir support in MAIL and MAILPATH
--enable-etcdir=DIR the default directory for global zsh scripts
--enable-function-subdirs
install functions in subdirectories
--enable-site-fndir=DIR same for site functions (not version specific)
--enable-fndir=DIR the directory in which to install functions
--with-tcsetpgrp assumes that tcsetpgrp() exists and works correctly
--with-term-lib=LIBS search space-separated LIBS for terminal handling
--enable-cap enable the search for POSIX capabilities (may
require additional headers to be added by hand)
--enable-pcre enable the search for the pcre library (may create
run-time library dependencies)
--enable-readnullcmd=PAGER
pager used when READNULLCMD is not set
--enable-custom-patchlevel
set a custom ZSH_PATCHLEVEL value
--enable-additional-fpath=DIR
add directories to default function path
--enable-ansi2knr translate source to K&R C before compiling
Компиляция работала, но было 2 сбоя среди 48 тестов, выполненных командой make check
:
% make
% make check
…
**************************************
46 successful test scripts, 2 failures, 0 skipped
**************************************
Makefile:187: recipe for target 'check' failed
make[1]: *** [check] Error 1
make[1]: Leaving directory '/home/user/GitRepos/zsh/Test'
Makefile:263: recipe for target 'check' failed
make: *** [check] Error 2
Я не мог избавиться от них.
Наконец, вместо использования make install
для установки двоичного файла я использовал checkinstall
, чтобы получить .deb
, который я могу
удалить, если мне нужно будет изменить оболочку в будущем (с помощью dpkg -r zsh
):
% sudo checkinstall
При установке мне пришлось дать краткое описание (я использовал оболочку с большим количеством характеристики
),
и что более важно, я должен был дать версию. Без версии, совместимой с политикой Debian,
checkinstall
не сгенерировал .deb
. Я просмотрел вывод apt-cache policy zsh
, чтобы проверить
какая схема именования используется Debian, и выбрал 5.3.1-1ubuntu2
.
% echo /bin/zsh >> /etc/shells
% chsh → /bin/zsh
Эти 2 строки были необходимы для того, чтобы Ubuntu распознал /bin/zsh
как допустимую оболочку для входа в систему и сделал ее моей оболочкой по умолчанию.
Теперь версия оболочки 5.3.1
(вместо 5.1.1
):
% zsh --version
zsh 5.3.1 (x86_64-pc-linux-gnu)
И оболочка запускается быстро (около 0,04 с
):
% repeat 10 =time zsh -i -c exit
0.06user 0.03system 0:00.12elapsed 80%CPU (0avgtext+0avgdata 5592maxresident)k
0inputs+0outputs (0major+5668minor)pagefaults 0swaps
0.06user 0.01system 0:00.09elapsed 77%CPU (0avgtext+0avgdata 5480maxresident)k
0inputs+0outputs (0major+5634minor)pagefaults 0swaps
0.04user 0.01system 0:00.07elapsed 82%CPU (0avgtext+0avgdata 5736maxresident)k
0inputs+0outputs (0major+5641minor)pagefaults 0swaps
0.04user 0.01system 0:00.07elapsed 77%CPU (0avgtext+0avgdata 5652maxresident)k
0inputs+0outputs (0major+5645minor)pagefaults 0swaps
0.03user 0.03system 0:00.07elapsed 82%CPU (0avgtext+0avgdata 5736maxresident)k
0inputs+0outputs (0major+5634minor)pagefaults 0swaps
0.04user 0.01system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5548maxresident)k
0inputs+0outputs (0major+5624minor)pagefaults 0swaps
0.04user 0.02system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5612maxresident)k
0inputs+0outputs (0major+5655minor)pagefaults 0swaps
0.04user 0.01system 0:00.07elapsed 77%CPU (0avgtext+0avgdata 5780maxresident)k
0inputs+0outputs (0major+5624minor)pagefaults 0swaps
0.03user 0.02system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5584maxresident)k
0inputs+0outputs (0major+5641minor)pagefaults 0swaps
0.03user 0.02system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5668maxresident)k
При первой компиляции я забыл переключиться на последнюю ветку релиза, поэтому был на мастере
.
У этой разрабатываемой версии zsh
время запуска было даже хуже, чем у версии из репозиториев Ubuntu.
Примерно 0,42 с
для запуска оболочки. Но опять же, только если я добавил каталог в fpath
в zshrc
и создал файл внутри последнего (достаточно было простого touch-файла
).
Так что мне интересно, возникла ли проблема из-за опций компиляции или из-за релизной версии. Надеюсь, релизная версия, которую я скомпилировал, останется быстрой…
Спасибо @thrigh и @Stéphane Chazelas за помощь в комментариях.