2012-11-20 64 views
3

通常,在运行shell脚本时,shell会在整个执行过程中保持脚本文件处于打开状态。在Unix系统上这不是问题。MSYS shell保持脚本文件打开,防止修改

但是,Windows会阻止修改以这种方式打开的文件。这意味着如果脚本在MSYS中运行,我需要在修改脚本之前杀死shell。这很烦人,因为git pullsvn up将会失败。

我正在寻找一个解决方案,例如通过我可以放在#!/bin/sh行中的特定选项,或某种类型的shell,这可能会导致脚本在安全的地方复制自己并执行而不是复制。

+0

是不是窗户精彩?我遇到了类似的问题。正如你所描述的,我从来没有见过'#!/ bin/sh ...'选项。在Linux VM中运行整个事情呢?另外,你知道Cygwin?它更加温暖,也许它有一个选择(但我怀疑它)。张贴Cygwin用户组?在http:// old(2?).nabble.com上也有一个MSYS用户组(不记得是旧的还是旧的)。祝你好运。 – shellter

+0

@shellter感谢提示。我很想运行脚本在Linux上,但是它是一个使用Visual Studio编译器的构建脚本,所以Windows是一个需求,但它运行在托管在Linux上的VM上! –

回答

3

您可以让脚本自行重新执行。斯普利特这样的:

#!/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 

在这种情况下,虽然,返回代码将是完全错误的,因为将任何事情等待脚本。

相关问题