MSYS shell 保持脚本文件打开,防止修改
Posted
技术标签:
【中文标题】MSYS shell 保持脚本文件打开,防止修改【英文标题】:MSYS shell keeping script file open, preventing modifications 【发布时间】:2012-11-20 12:58:30 【问题描述】:通常在运行 shell 脚本时,shell 会在整个执行过程中保持脚本文件打开。在 Unix 系统上,这不是问题。
但是,Windows 会阻止对以这种方式打开的文件进行修改。这意味着如果脚本在 MSYS 中运行,我需要先终止 shell,然后才能修改脚本。这很烦人,因为git pull
或svn up
会失败。
我正在寻找解决该问题的方法,例如通过我可以放入 #!/bin/sh
行的特定选项,或者某种可能导致脚本将自身复制到安全位置的 shell 单行而是执行副本。
【问题讨论】:
windows 不是很棒吗?我遇到过类似的问题。正如您所描述的,我从未见过#!/bin/sh ...
选项。在 Linux 虚拟机中运行整个东西怎么样?另外,你知道 Cygwin 吗?它更窗口化,也许它有一个选项(但我对此表示怀疑)。发布 Cygwin 用户组? old(2?).nabble.com 上还有一个 MSYS 用户组(不记得是旧的还是旧的 2。祝你好运。
@shellter 感谢您的提示。我很想在 Linux 上运行该脚本,但它是使用 Visual Studio 编译器的构建脚本,因此 Windows 是必需的。不过,它是在托管在 Linux 上的 VM 中运行的!
【参考方案1】:
您可以让脚本自己重新执行。像这样拆分它:
#!/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
不过,在这种情况下,返回码也全错了,等待脚本的任何东西也是如此。
【讨论】:
以上是关于MSYS shell 保持脚本文件打开,防止修改的主要内容,如果未能解决你的问题,请参考以下文章
在 MSYS 下使用 Command 在 Windows 上调用 shell 脚本