2010-02-18 58 views
10

有人注意到,如果修改shell腳本的源代碼,那麼當前運行的任何實例都可能會失敗?如何使shell腳本在運行時更健壯

這在我看來是非常糟糕的;這意味着在進行更改之前,我必須確保腳本的所有實例都已停止。我的首選行爲是現有腳本繼續使用舊源代碼運行,並且新實例使用新代碼(例如,perl和python程序會發生什麼情況)。

除了預先將shell腳本複製到臨時文件並從中運行,人們對此行爲是否有任何良好的解決方法?

謝謝, /YGA

+0

您也可以刪除腳本在運行,避免編輯。查看[這篇文章](http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-they-run)的原因以及如何實現它的自動化。 – 2012-03-31 02:28:44

回答

16

非常輕微除了下面的其他答案:

#!/bin/sh 
{ 
    # Your stuff goes here 
    exit 
} 

exit末是很重要的。否則,腳本文件可能仍會在最後訪問,以查看是否還有更多行要解釋。

這個問題後來被轉貼在這裏:Can a shell script indicate that its lines be loaded into memory initially?

+1

喬納森·萊弗勒的解決方案很好,但沒有退出就沒有爲我工作:-) – YGA 2010-03-09 23:54:52

2

確保外殼具有執行任何它之前分析整個文件:

#!/bin/ksh 
{ 
all the original script here 
} 

這做的伎倆。

順便說一下,在Perl(我假設Python)中,程序在執行任何它之前解析整個文件,完全按照這裏推薦的方式。這就是爲什麼你通常不會用Perl或Python來解決問題的原因。

+0

此代碼有一個缺陷。請參閱[由用戶「匿名」回答](http://stackoverflow.com/a/2358432/780703)。 – 2013-08-07 08:57:15

2

根據所涉及的shell腳本的複雜程度,所需的行爲可能不可行。

如果完整的shell腳本包含在單個源文件中,並且該文件在執行前被完全解析,那麼shell腳本在執行期間通常可以安全地修改光盤上的副本。將所有可執行語句包含到一個函數(或一系列函數)中通常會達到您所追求的目標。

#!/bin/sh 

doit() 
{ 
# Stuff goes here 
} 
# Main 
doit 

當shell腳本「包含」其他shell腳本(例如「。」或「source」)時會遇到困難。如果這些包含包含在一個函數中,那麼在執行流程中到達該語句之前,它們不會被分析。這使得shell腳本易受外部代碼更改的影響。另外,如果shell腳本運行任何外部程序(例如,shell腳本,編譯的程序等),那麼在達到執行的那個點(如果有的話)之前不捕獲該結果。

#!/bin/sh 

doit() 
{ 
    if [[some_condition]] ; then 
     resultone=$(external_program) 
    fi 
} 
# Main 
doit 
+0

你的代碼應該被認爲是'sh'的僞代碼。 – 2010-02-18 01:23:09