我在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
处理时不使用任何文件?
答案 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
,以便新进程在正确的目录中启动。