通常,在运行shell脚本时,shell会在整个执行过程中保持脚本文件的打开状态。 在Unix系统上这不是问题。
但是,Windows阻止修改以这种方式打开的文件。 这意味着如果一个脚本运行在MSYS中,我需要杀死shell才能修改脚本。 这很烦人,因为git pull
或svn up
会失败。
我正在寻找解决这个问题的方法,例如通过我可以放在#!/bin/sh
行的特定选项,或者某种types的shell,这可能会导致脚本在安全的地方复制自己,改为执行副本。
您可以让脚本自行重新执行。 像这样拆分它:
#!/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
可能不包含apostrophs,并且在上半部分设置的参数和变量是不可访问的。 很难给出一个更好的通用例子 – 也许,如果我能看到原始脚本?
如果这仍然不起作用,请尝试下面这个:
#!/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
但是,在这种情况下,返回码也将全部错误,正如任何等待脚本的东西一样。