是否可以从子目录的项目的/ bin目录运行命令?

时间:2019-08-16 12:53:14

标签: bash

我有一个c5项目,目录为C5PROJECTDIR,它有一个bin目录。是否有一种方法(无需将C5PROJECTDIR/bin添加到$PATH)来访问C5PROJECTDIR的任何其他子目录中的命令?

例如: 这里有一个x命令:C5PROJECTDIR/bin/x。 我想从C5PROJECTDIR/packages/some-other-dir的bash脚本运行此命令。

更新:子目录在树中的位置可能或多或少...

怎么可能?

2 个答案:

答案 0 :(得分:1)

PATH变量只会使事情变得简单。

您可以使用绝对路径运行任何命令,例如/bin/echo/home/jon/myscript。相对路径也可以使用~/../../bin/ls

脚本具有自己的PATH变量,因此您可以根据需要将所需的位置添加到脚本中的PATH

除此之外,您还必须处理权限。 执行脚本的用户必须具有x脚本的执行权限。


要查找并执行命令:

find C5PROJECTDIR -type f -executable -name "x" -exec {} \;

查找必须严格匹配仅一个命令,否则它将执行其所有资金。在这种情况下,C5PROJECTDIR下不能使用相同名称的脚本。

从安全角度考虑。我不建议这样做,因为任何人都可以使用脚本中使用的名称将可执行文件放在C5PROJECTDIR下。事情可能变得令人讨厌。

答案 1 :(得分:1)

有几种方法:

使用相对路径:

本质上直接使用二进制文件的路径(相对于当前脚本)调用二进制文件。如果您的脚本位于/home/user/foo/C5PROJECTDIR/packages/somedir/script中,则可以相对调用该脚本:

#!/usr/bin/env bash
../../bin/x

此方法的问题是可维护性。假设您要将脚本移至/home/user/foo/C5PROJECTDIR/packages/scripts,那么您将不得不更新所有脚本。

使用shell变量:

您可以定义包含基本值的变量PROJECTHOME代替相对路径。

#!/usr/bin/env bash
PROJECTHOME=/home/user/foo/C5PROJECTDIR
$PROJECTHOME/bin/x

这通常可以解决大多数问题,除非您将项目位置从/home/user/foo/C5PROJECTDIR移到/home/user/random-dir。但这可以通过简单的sed命令来解决,该命令搜索行/home/user/foo/C5PROJECTDIR并将其替换。