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 pullsvn 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 shell 翻译类似路径的字符串

在 VSCode 终端中运行 msys2 shell

在 MSYS 下使用 Command 在 Windows 上调用 shell 脚本

在 MSYS2/MinGW 中执行脚本

运行 PowerShell 脚本后如何保持 shell 窗口打开?

MSYS2/MinGW-w64安装