Как определить, какая версия readline bash используется?

Как определить, какую версию readline я использую в своей сессии bash?

Мне интересно, потому что у меня есть библиотека readline 6.3, но set enable-bracketed-paste on в моем .inputrc работает, хотя эта функция была добавлена ​​только в readline 7.0.

Я использую Bash 4.4.0 на MacOS 10.11 (установлен с Fink).

3 ответа

Как правило, нет надежного метода определения версии статически связанной библиотеки. Тем не менее, в этом случае, я полагаю, вы можете использовать значение rl_readline_version глобальная переменная.

readline.h определяет переменную препроцессора C, которая должна рассматриваться как целое число, RL_READLINE_VERSION, который может использоваться для условной компиляции кода приложения в зависимости от установленной версии Readline. Значение представляет собой шестнадцатеричное кодирование старшего и младшего номеров версий библиотеки в форме 0x MMmm. MM - двузначный номер основной версии; мм - двузначный младший номер версии. Для Readline 4.2, например, значение RL_READLINE_VERSION было бы 0x0402,

https://tiswww.case.edu/php/chet/readline/readline.html

Начиная с bash-2.05a и выше, это отображается как rl_readline_version как вы можете видеть здесь:

int rl_readline_version = RL_READLINE_VERSION;

https://git.savannah.gnu.org/cgit/bash.git/tree/NEWS?id=d233b485e83c3a784b803fb894280773f16f2deb

Самый простой способ проверить это с помощью отладчика, например gdb, Например:

$ gdb bash
(gdb) print /x (int) rl_readline_version
$1 = 0x700

Это значит что моя версия bash работает readline версия 7.0.

Если вам интересно, сопровождающий readline объяснил причину статического связывания в Mac OS X здесь:

  1. Существует специальная обработка для обеспечения связи оболочки со статическими версиями включенных библиотек readline и history в Mac OS X; Apple поставляет неадекватные динамические libreadline и libhistory "замены" в качестве стандартных библиотек.

https://tiswww.case.edu/php/chet/bash/NOTES

поскольку readline статически связан в Mac OS X, ldd а также otool не поможет Однако для полноты картины я покажу вам, как это выглядит в Linux. Вот как выглядит моя версия на Ubuntu 18.04:

$ ldd /bin/bash
    linux-vdso.so.1 (0x00007ffeb83c3000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fbcd7d57000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbcd7b53000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbcd7762000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbcd829b000)

Как видите, ldd выход также бесполезен в этом случае. Так что вместо этого я использовал strace:

$ strace -o strace.log -f bash
# Have to do stuff with interactive mode; `bash -c exit` won't do it.
$ exit

Я считаю, что соответствующий dtrace команда будет:

$ dtrace -o dtrace.log -f bash

но я не пробовал, поэтому не могу сказать наверняка. На данный момент я могу просто grep лог-файл для readline:

$ grep readline strace.log
strace.log:30194 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libreadline.so.7", O_RDONLY|O_CLOEXEC) = 3

Так что в Ubuntu 18.04 это версия readline 7, как и ожидалось.

$ dlocate -F '/lib/x86_64-linux-gnu/libreadline.so.7'
libreadline7:amd64: /lib/x86_64-linux-gnu/libreadline.so.7.0
libreadline7:amd64: /lib/x86_64-linux-gnu/libreadline.so.7
$ apt-cache policy libreadline7
libreadline7:
  Installed: 7.0-3
  Candidate: 7.0-3
  Version table:
 *** 7.0-3 500
        500 http://us.archive.ubuntu.com/ubuntu bionic/main amd64 Packages
        100 /var/lib/dpkg/status
      gdb -quiet -ex 'print /x (int) rl_readline_version' -ex 'quit' bash
# Outputs: $1 = 0x602 (Readline Version 6.02)

Это сокращенный ответ Натаниэля-м-Бобра

Не уверен, насколько вы привержены использованию fink, но есть еще один менеджер пакетов для macOS, который называется homebrew и может быть найден здесь или по адресу https://brew.sh/, который позволяет вам запускать более свежие версии программ. La BASH и т. д.

Чтобы установить homebrew, просто скопируйте / вставьте URL-адрес в предпочитаемый вами терминал, а затем выполните команду brew install bash,

У меня буквально была та же проблема, что и у вас, и я создал файл inputrc и связал его с ~/.inputrc из моего репозитория dotfiles я смог предотвратить автоматический запуск оболочки фрагментами.

После того, как вы все это сделаете, попробуйте скопировать / вставить следующий фрагмент в свой терминал, и он не должен работать, пока вы не нажмете клавишу ввода, если все настроено правильно.

ура Крис

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