#linux #bash #shell
#linux #bash #оболочка
Вопрос:
Могу ли я заставить BASH видеть определенную папку (назовем ее main_folder) в качестве корня моей файловой системы? Мне нужно, чтобы BASH вел себя таким образом, по крайней мере, во время автозаполнения имен параметров и имен команд, находясь внутри папки.
Допустим, у меня есть дерево каталогов, которое выглядит следующим образом:
/z/y/main_folder/a.txt
/z/y/main_folder/bin/b.txt
/z/y/main_folder/bin/c.txt
/z/y/main_folder/bin/d.sh
Теперь, когда я вызываю эту пользовательскую версию bash, я мог бы просто ввести:
/> /bi(TAB)/(TAB) /a(TAB)
Что будет расширяться до:
/> /bin/d.sh /a.txt
Где d.sh
находится команда для запуска и a.txt
является ее первым параметром. Если бы я был записан на /bin/
CD, я мог бы сделать:
/bin/> ./(TAB) (TAB)(TAB)
Что бы расширить команду d.sh
, и дало бы три варианта для первого параметра (а именно: b.txt
, c.txt
, d.sh
).
Несколько кратких дополнительных моментов:
- Мне все равно, недоступен ли исходный корень файловой системы или доступен по жесткой / программной ссылке.
- Мне все равно, смогу ли я запускать какие-либо команды, которые выходят за рамки main_folder (я все
$PATH
равно изменю переменную) или какие-либо встроенные оболочки. - Мне все равно, что
$PS#
$PWD
на самом деле содержат переменные , , и т. Д. - Я не хочу создавать свою собственную версию BASH (изменение исходного кода). Мое приложение должно (вероятно) запускаться с помощью некоторого скрипта (sh) или программы (C / C / C #), которая настраивает среду и либо продолжает работу в интерактивном режиме, либо запускает интерактивную оболочку в одной из последних строк.
- Я хочу запустить это как непривилегированный пользователь. Я не хочу разрешать пользователю
chroot
. - Меня не волнует безопасность, и я не собираюсь никого сажать в тюрьму. Мне просто нужен BASH для автозаполнения.
- Я бы не возражал «перехватить» BASH во время поиска в каталоге.
У меня такое чувство set
, что compgen
, complete
и compopt
встроенные функции — это то, что мне нужно использовать, но я не знаю как. Не похоже, что примеры, которые я нашел об этих командах, показывают все функции, а справочные страницы довольно хаотичны.
Спасибо, Купто 🙂
Комментарии:
1. Почему
d.sh
требуется, чтобы его аргументы были этими псевдопутями?2.
d.sh
это будет процедура интерфейса для программы, которая управляет моей/Documents/Projects
папкой. У меня есть программа, которая позволяет мне управлять всем этим деревом подкаталогов, и теперь я хочу создать для него интерактивный интерфейс. Я не хочу программировать оболочку самостоятельно, поэтому я скорее хочу изнасиловать BASH, чтобы сделать это за меня. Автоматическое завершение — единственное, что я не знаю, что нужно делать.3. чтобы уточнить…
d.sh
было бы что-то вроде:make_new_project
,info_about_project
илиlist_projects