如何使用相对路径调用脚本并将其父目录映射到 PATH?

如何使用相对路径调用脚本并将其父目录映射到 PATH?

我有一个按照惯例/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"

那么主脚本就总是能找到子项,只要它们一起移动,它们的相对位置就不会改变。

相关内容