如何在路径中目录的子文件夹中执行脚本
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
方法可能更好,但也可能导致其他问题。
如果有任何方法可以更改其他脚本,那确实是最好的选择。
考虑以下文件夹结构:
$ 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 youcd
,否则脚本可能会在意想不到的目录中执行,从而产生意想不到的后果。 - 如果脚本需要从不同的工作目录执行,您可以创建一个从该工作目录中的
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
方法可能更好,但也可能导致其他问题。
如果有任何方法可以更改其他脚本,那确实是最好的选择。