Bash 命令仅下载 Github 脚本的特定行

Bash 命令仅下载 Github 脚本的特定行

寻找这个答案没有成功,也许是因为我没有以正确的方式寻求答案。

我基本上想使用某种工具(例如 wget 或 curl)来检索托管在 github 上的文本文件的第二行。这样做的目的是确定所使用的脚本是否是最新版本,如果不是,则自动更新。

现在,这就是我实现这一目标的方法......

sudo wget -q https://raw.githubusercontent.com/Wade821/PiDrawpile/master/drawpile-installer-official-build-from-sources
sudo chmod 777 "$dpinstallloc/Programs" -R
echo
dpcheckversion=$(grep -m 1 "drawpilescriptversion=" "$dpinstallloc/Programs/$scriptname" | cut -c 23-26)
currentscriptname="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"

if [[ "$drawpilescriptversion" < "$dpcheckversion" ]]; then
    echo "Newest Script is using version $dpcheckversion."
    echo "Newer version of script available, the old script has been copied over"
    echo "the old script. Please re-run this script to use newest version."
    cd "$dpinstallloc"
    sudo rm -rf "$SCRIPTDIR/$currentscriptname"
    sudo cp "$dpinstallloc/Programs/$scriptname" "$SCRIPTDIR/$currentscriptname"
    sudo chmod 777 "$SCRIPTDIR/$currentscriptname"
    sudo rm -rf "$dpinstallloc/Programs/$scriptname"
    echo "Terminating script in 30 seconds."
    echo
    sleep 30s
    exit
elif [[ "$drawpilescriptversion" = "$dpcheckversion" ]]; then
    echo "Script is newest version available."
    sudo rm -rf "$dpinstallloc/Programs/$scriptname"
elif [[ "$drawpilescriptversion" > "$dpcheckversion" ]]; then
    echo "It appears the creator of the script has failed to update github with the newest version."
    echo "Please contact him to update the script there by emailing him at (redacted, minimizing number of posted locations for now)"
    echo
    echo "Script in use: $drawpilescriptversion"
    echo "Github Script: $dpcheckversion"
    echo
    echo "Pausing script for 30 seconds before continuing."
    sudo rm -rf "$dpinstallloc/Programs/$scriptname"
    sleep 30s
else
    echo "Unable to determine script version, proceeding with script."
fi

虽然这不是一个特别糟糕的方法,但它并不是最有效的,因为每次都需要下载整个文件。如果我能以某种方式将其限制为下载指定的文件行,那么整体上会更快。如果没有这样的方法,我想我会坚持使用这种方法,除非有人有更好的方法来解决它。

编辑:我还应该澄清一下,所讨论的脚本是编译和运行名为 Drawpile 的程序的服务器,供 Raspberry Pi 使用。由于可用软件包的版本不同,有时必须对源代码进行更改才能成功编译。其他时候,随着新功能的添加,需要安装新的软件包。自更新脚本的想法是防止不必要的“这不起作用”报告,而实际上当用户重用脚本或更新服务器时有更新可用。因此,由于这是针对最终用户的,因此通过 github 或令牌使用开发人员 API 身份验证并不是理想的结果,因为这会产生安全问题。因此,解决方案不应要求身份验证。

答案1

完全不同的解决方案,使用标题if-modified-sincewget使用当前本地版本的日期:

If-Modified-Since 请求 HTTP 标头使请求具有条件性:仅当请求的资源在给定日期之后最后一次修改时,服务器才会返回状态为 200 的资源。如果请求自那时起没有被修改,则响应将为 304,没有任何主体;前一个请求的 Last-Modified 响应标头将包含上次修改的日期。

要获取 GMT 中的文件日期(不考虑本地时区),您可以使用date -udate -u -d @$(stat -c %X targetfile)。您可以定义输出格式,datedate -R可以是一个简单的答案。

预期格式定义在此 RFC

这对我有用:

lastMod=$(date -ud @$(stat -c %X $localFile) +'%a, %d %b %Y %X GMT')
wget --header "If-Modified-Since: $lastMod" http://server/path/to/the/file

我的 Apache 非常挑剔,它确实想要星期几和GMT指标,但是一个简单的变体似乎也可以工作,尽管与 RFC 不一致:

lastMod=$(date -R -ud @$(stat -c %X $localFile))

date -R根据 RFC5322 格式化日期。但这仅适用于 TZ,+0000因此您仍然必须使用date -u

附言:在寻找示例时,我偶然发现一个页面阐述了支持这一点非常重要,因为 GoogleBot 会使用它,并且每个网站都需要与 GoogleBot 很好地兼容 :)

相关内容