如何在bash设置脚本中处理相对路径



我经常遇到这样的情况:我想为git存储库之类的东西提供某种"setup"或"install"脚本,尽管它也可以用于其他情况。

需要明确的是:"设置脚本"指的是放置一些文件、检查一些内容、创建某些依赖项等的脚本

问题是,如果我想使用与脚本相关的资源,或者想创建针对存储库中文件的链接,我需要能够引用与存储库根相关的资源或构建绝对路径。

目前我总是这样做:

SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)
ROOT=$(realpath "$SCRIPT_DIR/..")

但这似乎真的很糟糕,因为它很难理解,而且基本上在每个回购甚至文件中都有复制。

有更好的方法吗?像这样的脚本是不需要的吗?

有更好的方法吗?

否。

像这样的脚本是不需要的吗?

否。这很正常。

有其他方法吗?

我的手指习惯于键入"$(dirname "$(readlink -f "$0")")",但这并没有更好。

也不要使用大写变量。它们不仅大喊大叫,而且适用于环境变量,如PWDLINESCOLUMNSDISPLAYUIDIFSUSER等。在脚本中更喜欢小写变量。(我想说,ROOT是一个非常常见的,因此不好的变量名称。(

在git repo中,您可以使用git rev-parse --show-toplevel来查找工作树的根,然后从那里开始。

通用中,这是一个有点困难的问题。有太多的方法可以调用一个脚本来改变$0的实际含义,所以你不能真正依赖它。在我看来,你能做的最好的事情就是建立一个标准(例如,期望环境中的某些值,或者坚持脚本以./path/from/root/to/script的形式执行(,如果没有,就尝试退出并返回正确的错误消息。

这能改善脚本管理和可读性吗?

#!/usr/bin/env bash
source $HOME/common-tools/include.sh "${BASH_SOURCE[0]}"
echo $ROOT

在$HOME/通用工具/include.sh:中

SCRIPT_DIR=$(cd "$( dirname "$1" )" >/dev/null 2>&1 && pwd)
ROOT=$(realpath "$SCRIPT_DIR/..")

相关内容

  • 没有找到相关文章

最新更新