更新正在运行的 bash 文件

Posted

技术标签:

【中文标题】更新正在运行的 bash 文件【英文标题】:Updating a running bash file 【发布时间】:2019-09-07 18:12:06 【问题描述】:

我在 bash 脚本中有以下功能。让我们将此脚本称为example.sh。它位于应该更新的 git 存储库中。

example.sh(简化版)

# Directory of script
dir="$( cd "$( dirname "$BASH_SOURCE[0]" )" >/dev/null 2>&1 && pwd )"

update() 
  ( cd "$dir" && git pull )


if [ "$1" == "update" ]; then
  update
fi

然后我调用example.sh update(它调用函数),所以它执行git pull

现在的问题是当example.sh 发生变化时,它需要自行更新。 Linux 这样做没有问题,但 GitBash (Windows..) 抱怨说:

错误:无法创建文件 example.sh:权限被拒绝

可能是因为它仍在使用 example.sh update 并等待 git pull 完成。

我已经试过了

( cd "$dir" && git pull & )

bash -c "sleep 1 && cd \"$dir\" && git pull" &

如何启动一个新进程来更新这个 repo,以便在git pulling 时没有文件在使用?

【问题讨论】:

可能什么也做不了。出于某种原因,bash 和其他一些 shell 我尝试在运行时为脚本文件保留一个描述符。 您尝试过我的解决方案吗?我很好奇自己是否有效。 【参考方案1】:

由于缺少适用于 Windows 的 GitBash,我无法测试以下建议。如果您能给我一些反馈,我会很高兴。

在脚本的开头,添加

#! /bin/bash

self="$(sed '0,/^# ACTUALSCRIPT/d' "$BASH_SOURCE")"
exec bash -c "$self" "$0" "$@"
# ACTUALSCRIPT (keep this comment, the script relies on it)

# your old script
# ...

这将用一个新的bash 进程替换脚本的进程,该进程从其参数而不是文件中读取命令。

请注意,您对脚本目录的检测可能无法在bash -c 中工作。如果需要,您可以将目录作为参数传递。或者,您可以cd 之前 exec 以便新进程在正确的目录中启动。

【讨论】:

以上是关于更新正在运行的 bash 文件的主要内容,如果未能解决你的问题,请参考以下文章

执行n stable命令在Windows系统中更新node版本报错“‘bash‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。“

如何从 WSL (Ubuntu) Bash 运行 Windows 可执行文件

Bash 脚本日志文件连续显示到屏幕上

Bash-在每个grep对应关系上运行命令而不停止尾部-n0 -f

在bash脚本/命令中,如何使PC发出蜂鸣声或播放声音文件?

从nodejs运行bash命令[重复]