На этот вопрос уже есть ответ здесь:
TL;DR : set -o vi
не включает режим редактирования vi
Во многих оболочках, включая dash
, стандарт POSIX предписывает, что set -o vi
включит режим редактирования vi, в котором пользователь интерактивной оболочки может перемещаться по строке, используя vi-стиль ярлыков. В dash
(оболочка Ubuntu по умолчанию, симлинкованная на /bin/sh
) это не работает, хотя на странице man указано, что эта возможность доступна.
Пример :
$ dash
$ set -o vi
$ hello wolrd^[I
Что должно было произойти, так это то, что при нажатии Esc , Shift + i курсор должен был перескочить в начало строки. Как вы можете видеть, вместо этого я получаю на выходе управляющий символ. Я попросил нескольких пользователей проверить это в чате AskUbuntu, и они подтвердили такое же поведение.
Обратите внимание, что это не связано с эмулятором терминала - я тестировал это в трех разных: xterm, gnome-terminal и terminator. Я тестировал это с другими оболочками, bash
, mksh
и ksh93
- все работают правильно, как и ожидалось, так что это проблема только dash
.
Мне было любопытно на предмет этого так, я загрузил исходный код tarball с восходящих загрузок ТИРЕ и извлек исходные файлы. Я проверил на файл README, который должен предоставить информацию о программе и ее опциях сборки, но не было никого, таким образом, я работал ./configure --help
и его вывод включает:
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-libedit Compile with libedit support
Так, похоже, что libedit библиотекой пользуются для обеспечения возможностей редактирования строки, но это не значение по умолчанию при создании источника. Я также нашел этот ответ на сообщение списка рассылки на наборе-o vi не работающий:
Я думаю, что это требует, чтобы тире был создан с поддержкой libedit работе.
Я проверил, какие библиотеки были связаны с dash
исполняемый файл на моем сервере Ubuntu и отметил libedit
не был включен:
$ ldd /bin/dash
linux-vdso.so.1 => (0x00007fffcfbd6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f013a0b7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f013a475000)
Я предполагаю это, когда специалисты по обслуживанию пакета Debian создают dash
пакет, они опускают эту дополнительную конфигурацию, поскольку они не хотели бы sh
иметь внешние зависимости от других библиотек. Они могли, вероятно, связать библиотеку статически, но главную причину для использования dash
как sh
должен сохранить оболочку максимально маленькой и быстрой так, чтобы сценарии запуска выполненный быстро.
Править: Я просто искал “libedit тире”, и главным результатом был очень похожий вопрос на этом сайте, которому хорошо ответил muru.
Для тех, кому могло бы быть интересно, это, шаги, требуемые создавать из источника.
Загрузите новый источник tarball:
wget http://gondor.apana.org.au/~herbert/dash/files/dash-0.5.9.tar.gz
wget http://gondor.apana.org.au/~herbert/dash/files/dash-0.5.9.tar.gz.sha256sum
Проверьте подлинность tarball:
sha256sum -c <( awk '/dash/{ print $1 " " $3}' dash-0.5.9.tar.gz.sha256sum )
gpg --verify --auto-key-retrieve dash-0.5.9.tar.gz.sha256sum
Извлеките исходные файлы и изменение в исходный каталог:
tar -xf dash-0.5.9.tar.gz
cd dash-0.5.9
Выполненный ./configure --with-libedit
создать Make-файлы. Однако это перестанет работать бесшумно если версия разработки libedit
библиотека установлена. Было бы лучше, если бы настраивать сценарий жаловался больше verbosely, поскольку не было очевидно, что этому не удавалось найти необходимые файлы.
sudo apt-get install libedit-dev
./configure --with-libedit
Создайте программу и (дополнительно) установите ее в /usr/local/bin
:
make
sudo make install