Enable in da Bash
BASH DAYS — авторский канал от действующего девопсаПодпишись на наш ТГ канал: @bashdays
Вчера посмотрел спокойной ночи малыши и отрубился, каково было моё удивление, что в 6 утра не пришлось вставать и отвозить ребенка в школу. Каникулы же! Эхх… Ладно, а у нас бесконечные рабочие будни.
Сегодня обсудим интересную команду в bash, которая называется enable. Эта команда включает или отключает встроенные команды оболочки. Чтобы проще было понять эту шляпу, разберем на практике.
Отключение встроенных команды позволяет выполнить дисковую команду, имеющую то же имя, что и встроенная команда оболочки, без указания полного пути, даже если оболочка ищет встроенные команды перед дисковыми командами.
Запускаем:
type test
И видим выхлоп: test is a shell builtin. То есть используется команда test встроенная в оболочку. А не та что лежит на пути в test: /usr/bin/test. А как нам воспользоваться дисковой версией этой утилиты? А вот так:
enable -n test type test
И мы получаем уже такое: test is /usr/bin/test. Получается мы сделали некое переключение. И по факту используем разные версии test.
Чтобы включить обратно встроенную команду test в оболочке, выполняем:
enable test
Так окей. Что еще можно с этим интересного сделать? А можно подгрузить расширения поставляемые с оболочкой. Некие плагины, экстеншены. Для этого эти экстеншены нужно установить (если у тебя их нет:
apt/yum install bash-builtins
Все это дело установится в папку /usr/lib/bash/. В ней будут всякие mkdir, rm, sleep и т.п. По сути это те же дисковые команды, только экстеншены для оболочки.
Для начала узнаем дисковую версию команды mkdir:
mkdir --version
Ага, есть: mkdir (GNU coreutils) 8.32
Теперь загружаем экстеншен в оболочку:
enable -f /usr/lib/bash/mkdir mkdir mkdir --version
Хе! -bash: mkdir: --: invalid option
Теперь запускаем:
type mkdir
И получаем: mkdir is a shell builtin, то есть теперь mkdir используется не системный (дисковый), а тот что подгружен в оболочку bash.
Например, ты снес все системные бинарники и у тебя есть только bash. Через подгрузку экстеншенов можно без проблем обслуживать свою операционную систему, даже если в системе пропали всякие mkdir и т.п.
Чтобы посмотреть что вообще подгружено в оболочку, воспользуйся командой:
lsof +fg -p $$
Получишь отчет по текущему процессу, что подгружено в данный момент в оболочку и используется.
С версии 4.4 в bash появилась переменная BASH_LOADABLES_PATH, с помощью нее ты можешь задать путь для поиска экстеншенов. Тогда при подгрузки этих модулей, не нужно будет использовать полные пути.
BASH_LOADABLES_PATH=/usr/lib/bash/ enable -f sleep sleep
Для чего это может все пригодится? Да черт его знает. Например, можешь собрать chroot окружение и не добавлять дисковые утилиты, а подгрузить только необходимые модули для встроенной оболочки.
Ну либо в ситуации когда ты случайно снес бинарники и нужно как-то админить и восстанавливать систему. В общем тут всё рассчитано на полный полет твоей фантазии.
Развлекайся )