[sisyphus] Про взаимодействие bash с внешней libreadline

Dmitry V. Levin ldv на altlinux.org
Вт Дек 17 04:48:58 MSK 2013


On Mon, Dec 16, 2013 at 08:16:23PM +0400, Sergey Vlasov wrote:
> На самом деле, возможно, это баг в bash (точнее, во взаимодействии bash с
> внешней библиотекой libreadline).
> 
> Дело в том, что в libreadline есть функция sh_set_lines_and_columns(),
> которая как раз и добавляет в окружение текущего процесса переменные LINES
> и COLUMNS:
> 
>   http://git.altlinux.org/gears/r/readline.git?p=readline.git;a=blob;f=readline/shell.c;h=346f8113d43d742191f34f431d55e94316e4431d;hb=bc8ee94c5760cc286148d7ab25f2606c0eeeb52a#l121
> 
> Однако ближе к началу файла shell.c есть следующий комментарий:
> 
>  88 /* All of these functions are resolved from bash if we are linking readline
>  89    as part of bash. */
> 
>   http://git.altlinux.org/gears/r/readline.git?p=readline.git;a=blob;f=readline/shell.c;h=346f8113d43d742191f34f431d55e94316e4431d;hb=bc8ee94c5760cc286148d7ab25f2606c0eeeb52a#l88
> 
> И действительно, в самом bash тоже определяется функция
> sh_set_lines_and_columns():
> 
>   http://git.altlinux.org/gears/b/bash.git?p=bash.git;a=blob;f=bash/variables.c;h=1c782534e22d77e492cb66cad6d8666c9a911e23;hb=ab284e13150cb2edf3345256c6ddd919babf3a24#l864
> 
> В отличие от реализации в libreadline, функция из bash использует не
> setenv(), а внутреннюю функцию bash bind_variable(), которая устанавливает
> внутреннюю переменную shell, по умолчанию не экспортирующуюся в дочерние
> процессы; именно такое поведение можно наблюдать сейчас в zsh - в скриптах
> можно использовать переменные $LINES и $COLUMNS, но zsh не передаёт эти
> переменные другим процессам, если не выполнить export явно.
> 
> Однако в ALT пакеты bash и libreadline собраны таким образом, что при
> вызове sh_set_lines_and_columns() из функций libreadline всегда вызывается
> реализация этой функции внутри libreadline - перекрытие её реализацией из
> bash, предполагавшееся разработчиками, не выполняется.

Вот уж действительно peculiar design.

Видимо, придется превратить все функции sh_*, определенные в файле
readline/shell.c, в weak alias'ы, и экспортировать их из libreadline.
Другого способа реализовать задуманное автором перекрытие функций
при использовании динамической линковки с libreadline я не вижу.

http://git.altlinux.org/tasks/110622/


-- 
ldv
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 198 байтов
Описание: отсутствует
Url     : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20131217/c6ab0096/attachment.bin>


Подробная информация о списке рассылки Sisyphus