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