更新正在运行的bash文件

时间:2019-04-17 13:21:20

标签: windows bash git git-bash

我在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" &

我如何触发新流程来更新此存储库,以便在git pull处理时不使用任何文件?

1 个答案:

答案 0 :(得分:0)

由于缺少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,以便新进程在正确的目录中启动。