У меня есть папка /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"
тогда основной скрипт всегда находит дочерний элемент, если только они перемещены вместе так, что их относительное положение не меняется.