Как вызвать скрипт, используя относительный путь, родительский каталог которого отображен в PATH?

Как вызвать скрипт, используя относительный путь, родительский каталог которого отображен в PATH?

У меня есть папка /usr/bin/vendor/, которая добавляется PATHпо соглашению и содержит, например, скрипт оболочки do_something.sh. Теперь я хотел бы добавить подпапку /usr/bin/vendor/some_tool/для дополнительного хранения одного или нескольких скриптов Perl, сгруппированных вместе, поскольку они имеют одно и то же назначение, и мне нужно дополнительно управлять файлами проекта Eclipse, возможно, даже файлами конфигурации и т. д. В конце концов, я могу получить /usr/bin/vendor/some_tool/do_a.plи /usr/bin/vendor/some_tool/do_b.pl.

Из-за PATH, я могу легко вызывать do_something.shвезде. Но есть ли способ вызывать some_tool/do_a.plтем же способом? Действительно some_tool/do_a.plс этим относительным путем, чтобы я знал, что выполняю задачу do_a. some_toolЭто в значительной степени соглашение о формулировках/именованиях, которое я хотел бы реализовать с помощью относительной структуры dir.

Попробовал это на оболочке, и это, конечно, не сработало, но, возможно, я что-то делаю не так, и это должно работать в целом. Но я думаю, что это не должно работать, и единственным решением будет создать файл, /usr/bin/vendor/some_tool_do_a.shкоторый перенаправляет все аргументы в /usr/bin/vendor/some_tool/do_a.pl.

решение1

На странице руководства bashуказано

   PATH   The  search  path for commands.  It is a colon-separated list of
          directories in which the shell looks for commands  (see  COMMAND
          EXECUTION  below).

Затем он продолжает говорить:

   If  the name is neither a shell function nor a builtin, and contains no
   slashes, bash searches each element of the PATH for  a  directory  con‐
   taining  an  executable  file  by that name.

Таким образом, ответ, по-видимому, будет таким: «Нет, то, что вы хотите сделать, не поддерживается bash».

решение2

Нет, это невозможно: любая /введенная вами команда преобразуется в абсолютный путь (если /это первый символ) или относительный путь по отношению к текущему каталогу, а не в относительный путь внутри PATHзаписей.

Обходным решением может быть связывание всех скриптов /usr/bin/vendor/some_tool/с /usr/bin/vendor/:

ln [-s] /usr/bin/vendor/some_tool/* /usr/bin/vendor/

Можно использовать как жесткие, так и мягкие ссылки.

Если при вызове скрипта вы всегда находитесь в одном и том же рабочем каталоге (или в небольшом количестве каталогов), то более простым решением может быть создание относительной ссылки из этого (или каждого) каталога:

ln -s /usr/bin/vendor/some_tool .

В этом случае вам необходимо использовать символическую ссылку(и).

Другим обходным путем может быть определение скрипта с коротким именем для выполнения этой функции, который можно вызвать примерно так:

tl some_tool/do_a.pl

tlпроанализирует переданный параметр, выполнит PATHпоиск скрипта в каждом компоненте, а затем вызовет полный путь к скрипту.

решение3

Что я делаю в «основном» скрипте:

mydir=$(dirname "$0")
"$mydir/subdir/otherscript"

тогда основной скрипт всегда находит дочерний элемент, если только они перемещены вместе так, что их относительное положение не меняется.

Связанный контент