如何在路径中目录的子文件夹中执行脚本

How to execute a script within a subfolder of a directory in path

考虑以下文件夹结构:

$ tree ~/test_path
test_path
`-- sub_folder
    `-- script.sh

1 directory, 1 file

假设您已将 test_path 添加到您的路径中 export PATH=$PATH:~/test_path

$ whereis sub_folder
sub_folder: /home/murtraja/test_path/sub_folder

现在如何通过调用sub_folder/script.sh来执行script.sh?

$ sub_folder/script.sh
bash: sub_folder/script.sh: No such file or directory

编辑:我不想更改调用 sub_folder/script.sh 因为这是由另一个我不能(避免)更改的脚本调用的。

由于您已将其添加到您的路径中,因此您只需按名称调用脚本即可。它也应该让你完成制表符。

$ ./script.sh

简短回答:你不能,但根据你面临的一系列限制,可能有另一种方法来处理它。

长答案:当命令名称包含至少一个斜杠字符时,它被视为可执行文件的路径(即它不搜索 $PATH 中的目录)。使用命令名称 sub_folder/script.sh,它包含一个斜杠,但 不以 斜杠开头,因此它将相对于当前工作目录进行解析。

所以有两种可能性可以使这项工作:

  • 如果你能在运行之前cd~/test_path,它会直接找到它。当然,这可能会破坏其他东西(即使用相对路径 and/or 纯文件名并期望它们在其他地方解析的任何其他东西)。另外,一定要 check for errors when you cd,否则脚本可能会在意想不到的目录中执行,从而产生意想不到的后果。
  • 如果脚本需要从不同的工作目录执行,您可以创建一个从该工作目录中的 sub_folder~/test_path/sub_folder 的符号 link。但是根据脚本工作目录的位置,这可能是不可能的或不安全的。如果可能,我会避免使用此选项。

还有一个选项依赖于 bash 的 weird/nonstandard 特性:定义带有斜线的函数名的能力。但这有奇怪的限制,具体取决于您拥有的 bash 版本:

  • 你可以这样定义一个函数:

     sub_folder/script.sh() { ~/test_path/sub_folder/script.sh "$@"; }
    

    然后使用 export -f sub_folder/script.sh(因此 bash 子进程继承它),或者在包装脚本中执行此操作,然后 source 您无法从那里更改的脚本(所以它是相同的 shell,并且不需要继承)。

    难点:bash有的版本拒绝导出名称怪异的函数,有的拒绝继承。所以 export 方法可能会或可能不会工作(并且可能由于更新而意外中断)。 source 方法可能更好,但也可能导致其他问题。

如果有任何方法可以更改其他脚本,那确实是最好的选择。