我有一个按照惯例/usr/bin/vendor/
添加到的文件夹PATH
,其中包含例如 shell 脚本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
。这几乎是我想使用相对目录结构实现的措辞/命名约定。
在 shell 上试过了,当然没用,但也许我做错了什么,一般来说它应该可以工作。但我想它不应该,唯一的解决方法是创建一个将/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"
那么主脚本就总是能找到子项,只要它们一起移动,它们的相对位置就不会改变。