Изменить корневой путь для функции автоматического завершения bash (ВКЛАДКА)

#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