2012-11-20 62 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 

在這種情況下,雖然,返回代碼將是完全錯誤的,因爲將任何事情等待腳本。

相關問題