【问题标题】:How to execute a script within a subfolder of a directory in path如何在路径中目录的子文件夹中执行脚本
【发布时间】:2021-06-29 19:07:23
【问题描述】:

考虑以下文件夹结构:

$ 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,因为这是由另一个我无法更改的脚本调用的
  • 将此添加到您的 ~/.bashrc: function sub_folder/script.sh { (cd ~/test_path; command sub_folder/script.sh); } ;)

标签: bash shell ubuntu path environment-variables


【解决方案1】:

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

$ ./script.sh

【讨论】:

  • 但它不在 OP 的 PATH 中。 ~/test_path 在他们的 PATH 中,但脚本在 ~/test_path/sub_folder 中。
  • @GordonDavisson,是的,谢谢你理解我的问题
  • 我在两个地方有相同的测试脚本。一个是我错误地认为是从那里在 Ubuntu 机器上运行的子文件夹。另一个直接在我的路径中的文件夹中,因此它运行的是同一个文件而不是嵌套版本。这解释了不正确的结果。我很抱歉。
【解决方案2】:

简短回答:您不能,但根据您所面临的一组约束,可能有另一种处理方式。

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

因此,有几种可能性可以使这项工作:

  • 如果你在运行这个之前可以cd 到~/test_path,它会直接找到它。当然,这可能会破坏其他东西(即使用相对路径和/或普通文件名并期望它们在其他地方解析的任何其他东西)。另外,请务必check for errors when you 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,继承不是' t 必要的)。

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

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

【讨论】:

  • 很好的答案,如果我可以访问该脚本并且能够更改它,您能否提供我可以做的不同事情?比如cmd=`whereis sub_folder | cut -d ' ' -f2`/script.sh,然后使用$cmd $arg1 $arg2
  • @MurtazaRaja 我会避免(错误)使用PATH —— 要么将~/test_path/sub_folder 本身添加到PATH,然后在脚本中运行script.sh,或者创建一个不同的环境变量来引用这个位置(例如export SCRIPT_PATH=~/test_path/sub_folder 然后使用"$SCRIPT_PATH/script.sh" 运行它)。 (注意:我通常建议不要使用全大写变量以避免与具有特殊功能的各种全大写名称发生冲突,但在这种情况下,您实际上是在创建自己的特殊功能 var,所以它看起来很合适)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 2023-04-01
  • 2018-09-18
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
相关资源
最近更新 更多