1

У меня есть папка /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 .

3 ответа3

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 искать скрипт в каждом компоненте, а затем вызывать полный путь к скрипту.

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 ».

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .