我有一个c5项目,目录为C5PROJECTDIR
,它有一个bin目录。是否有一种方法(无需将C5PROJECTDIR/bin
添加到$PATH
)来访问C5PROJECTDIR
的任何其他子目录中的命令?
例如:
这里有一个x
命令:C5PROJECTDIR/bin/x
。
我想从C5PROJECTDIR/packages/some-other-dir
的bash脚本运行此命令。
更新:子目录在树中的位置可能或多或少...
怎么可能?
答案 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
并将其替换。