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



考虑以下文件夹结构:

$ 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,因为它是由另一个脚本调用的,我无法(避免(更改。

简单回答:你不能,但根据你面临的一组约束,可能有另一种方法来处理它。

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

因此,有两种可能性可以实现这一点:

  • 如果在运行之前可以从cd~/test_path,它会直接找到它。当然,这可能会破坏其他东西(即使用相对路径和/或纯文件名并希望在其他地方解决它们的任何其他东西(。此外,当cd时,一定要检查是否有错误,否则脚本可能会在意外的目录中执行,从而产生意外的后果
  • 如果脚本需要从不同的工作目录执行,则可以创建一个从该工作目录中的sub_folder~/test_path/sub_folder的符号链接。但根据脚本的工作目录,这可能是不可能的,也可能是不安全的。如果可能的话,我会避免使用这个选项

还有一个选项依赖于bash的一个奇怪/非标准特性:定义带有斜杠的函数名的能力。但根据bash的版本,这有一些奇怪的限制:

  • 您可以定义这样的函数:

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

    然后使用export -f sub_folder/script.sh(因此bash子进程继承它(,或者在包装器脚本中执行此操作,然后使用无法更改的source脚本(因此它是同一个shell,不需要继承(。

    困难:有些版本的bash拒绝导出名称怪异的函数,有些则拒绝继承它们。因此,export方法可能工作,也可能不工作(并且可能由于更新而意外中断(。source方法可能更好,但也可能会引起其他问题。

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

由于已将其添加到路径中,因此只需按名称调用脚本即可。它还应该让你标签完成。

$ ./script.sh

相关内容

  • 没有找到相关文章