考虑以下文件夹结构:
$ 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