更新正在运行的 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 pull
ing 时没有文件在使用?
【问题讨论】:
可能什么也做不了。出于某种原因,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-在每个grep对应关系上运行命令而不停止尾部-n0 -f