Сегодня обсудим интересную команду в bash, которая называется enable. Эта команда включает или отключает встроенные команды оболочки. Чтобы проще было понять эту шляпу, разберем на практике.
Отключение встроенных команды позволяет выполнить дисковую команду, имеющую то же имя, что и встроенная команда оболочки, без указания полного пути, даже если оболочка ищет встроенные команды перед дисковыми командами.Запускаем:
type test
И видим выхлоп: test is a shell builtin. То есть используется команда test встроенная в оболочку. А не та что лежит на пути в test: /usr/bin/test. А как нам воспользоваться дисковой версией этой утилиты? А вот так:
enable -n testИ мы получаем уже такое: test is /usr/bin/test. Получается мы сделали некое переключение. И по факту используем разные версии test.
type 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Хе! -bash: mkdir: --: invalid option
mkdir --version
Теперь запускаем:
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/Для чего это может все пригодится? Да черт его знает. Например, можешь собрать chroot окружение и не добавлять дисковые утилиты, а подгрузить только необходимые модули для встроенной оболочки.
enable -f sleep sleep
Ну либо в ситуации когда ты случайно снес бинарники и нужно как-то админить и восстанавливать систему. В общем тут всё рассчитано на полный полет твоей фантазии.
Развлекайся )
tags: #linux #bash #utils
—
💩 @bashdays