通常在运行 shell 脚本时,shell 会在整个执行过程中保持脚本文件处于打开状态。在 Unix 系统上,这不是问题。
但是,Windows 会阻止对以这种方式打开的文件进行修改。这意味着如果脚本在 MSYS 中运行,我需要先终止 shell,然后才能修改脚本。这很烦人,因为git pull
或svn up
将失败。
我正在寻找该问题的解决方案,例如通过我可以放入#!/bin/sh
行中的特定选项,或者某种可能导致脚本将自身复制到安全位置并执行复制的外壳单线。
通常在运行 shell 脚本时,shell 会在整个执行过程中保持脚本文件处于打开状态。在 Unix 系统上,这不是问题。
但是,Windows 会阻止对以这种方式打开的文件进行修改。这意味着如果脚本在 MSYS 中运行,我需要先终止 shell,然后才能修改脚本。这很烦人,因为git pull
或svn up
将失败。
我正在寻找该问题的解决方案,例如通过我可以放入#!/bin/sh
行中的特定选项,或者某种可能导致脚本将自身复制到安全位置并执行复制的外壳单线。
您可以让脚本重新执行自身。像这样拆分它:
#!/bin/sh
if test -z "$MYSCRIPT_REEXEC"; then
: stuff you do before git pull
exec env MYSCRIPT_REEXEC=1 sh -c "git pull; . '$0'"
fi
: stuff you do after git pull
这是一个简单的案例,$0
可能不包含撇号,并且前半部分设置的参数和任何变量都无法访问。很难给出一个更好的通用示例——也许,如果我能看到原始脚本?
如果这仍然不起作用,试试这个:
#!/bin/sh
if test -z "$MYSCRIPT_REEXEC"; then
: stuff you do before git pull
env MYSCRIPT_REEXEC=1 sh -c "sleep 1; git pull; . '$0'" &
exit 0
fi
: stuff you do after git pull
但是,在这种情况下,返回码也都是错误的,等待脚本的任何东西也是如此。