有人注意到,如果修改shell腳本的源代碼,那麼當前運行的任何實例都可能會失敗?如何使shell腳本在運行時更健壯
這在我看來是非常糟糕的;這意味着在進行更改之前,我必須確保腳本的所有實例都已停止。我的首選行爲是現有腳本繼續使用舊源代碼運行,並且新實例使用新代碼(例如,perl和python程序會發生什麼情況)。
除了預先將shell腳本複製到臨時文件並從中運行,人們對此行爲是否有任何良好的解決方法?
謝謝, /YGA
有人注意到,如果修改shell腳本的源代碼,那麼當前運行的任何實例都可能會失敗?如何使shell腳本在運行時更健壯
這在我看來是非常糟糕的;這意味着在進行更改之前,我必須確保腳本的所有實例都已停止。我的首選行爲是現有腳本繼續使用舊源代碼運行,並且新實例使用新代碼(例如,perl和python程序會發生什麼情況)。
除了預先將shell腳本複製到臨時文件並從中運行,人們對此行爲是否有任何良好的解決方法?
謝謝, /YGA
非常輕微除了下面的其他答案:
#!/bin/sh
{
# Your stuff goes here
exit
}
的exit
末是很重要的。否則,腳本文件可能仍會在最後訪問,以查看是否還有更多行要解釋。
這個問題後來被轉貼在這裏:Can a shell script indicate that its lines be loaded into memory initially?
喬納森·萊弗勒的解決方案很好,但沒有退出就沒有爲我工作:-) – YGA 2010-03-09 23:54:52
確保外殼具有執行任何它之前分析整個文件:
#!/bin/ksh
{
all the original script here
}
這做的伎倆。
順便說一下,在Perl(我假設Python)中,程序在執行任何它之前解析整個文件,完全按照這裏推薦的方式。這就是爲什麼你通常不會用Perl或Python來解決問題的原因。
此代碼有一個缺陷。請參閱[由用戶「匿名」回答](http://stackoverflow.com/a/2358432/780703)。 – 2013-08-07 08:57:15
根據所涉及的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
你的代碼應該被認爲是'sh'的僞代碼。 – 2010-02-18 01:23:09
您也可以刪除腳本在運行,避免編輯。查看[這篇文章](http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-they-run)的原因以及如何實現它的自動化。 – 2012-03-31 02:28:44