2014-03-02 37 views
0

我有一個腳本改變了另一個程序的一些東西,其中一個是用一組不同的標誌調用所述程序。

標誌很長,容易出錯並且難以記住,所以我寫的這個腳本想要覆蓋該可執行文件,這樣當用戶調用腳本時,它實際上會調用腳本以及額外的複雜參數。

我知道的至少3種方式來實現上述:

  • 創建一個別名:alias foo=/usr/bin/foo --compicated-flag ComplexArgument
  • 創建一個函數:

    function foo { 
        /usr/bin/foo --compicated-flag ComplexArgument 
    } 
    
  • 改變$PATH使非-文件的標準位置在用戶實際使用foo之前被調用,其中包含以下內容:

    /usr/bin/foo --compicated-flag ComplexArgument 
    

我的問題是,我希望用戶能夠運行一個腳本,將這些設置與只是一個命令。我不想通過第二個動作提示用戶,例如「現在您需要輸入此文件或每次輸出$PATH」。

由於ComplexArgument被編程來計算,並將其變化很大,無論是alias也不function方法將工作(例如,宣佈那些在bashrczshrc)。同樣重要的是要注意,這些更改應該只是臨時的,並且用戶可能會或可能不想要設置它。更多理由不應將這些更改添加到RC shell文件中。

所以我唯一回避的事情就是改變$PATH

我知道要更改環境變量並影響子外殼,我需要撥打exec。例如:

export PATH=/path/to/other/foo:$PATH 
    exec $SHELL 

這樣$PATH會「粘」到子shell。

除此之外,在某些環境下,它肯定不會。

例如在OSX中,如果您安裝了HomeBrew,建議您更改$PATH,以使/usr/local/bin位於第一位,以便HomeBrew安裝的庫首先出現。

如果用戶在他的.zshrc喜歡定義它:

PATH=/usr/local/bin:$PATH 

這意味着,不管是什麼我的腳本設置,ZSH將讀取.zshrc文件,並得到/usr/local/bin第一。

如果我使用ZSH的標誌之一,以避免讀取用戶的RC文件,然後其他的事情將停止工作,因爲$PATH將不再正確設置和ZSH將總是呼叫/etc/zshenv這在一些系統中有這樣的:

# system-wide environment settings for zsh(1) 
if [ -x /usr/libexec/path_helper ]; then 
    eval `/usr/libexec/path_helper -s` 
fi 

這使事情變得更糟,因爲這改變$PATH,以確保一些路徑來之前不管是什麼$PATH以前。

因此,我發現兩個第一項(aliasfunction)不夠充分,第三個(更改$PATH)是不可靠的。

我知道必須有一個正確的方法來做到這一點,我理解子shell的侷限性,並改變一個腳本中的內容並使它們保持不變,但會提示用戶「源文件修改爲$PATHexport PATH=/path/to/foo:$PATH「使這個可靠的唯一方法?

+0

經常變化的冗長複雜的論點?聽起來像'ghostscript'。無論如何,我會將'/ usr/local/bin/whatever'移動到'/ usr/local/bin/whatever.installed'上,然後在''/ usr/local/bin/exec'安裝的版本。 – bishop

回答

0

第四個選項將是複雜函數的一個包裝。因此,您可以將複雜的腳本從complicated重命名爲complicated.orig,然後編寫一個新的complicated計算參數,然後使用新計算的參數計算exec的complicated.orig。這樣您就不會依賴於所有更新其登錄配置文件以使用您的別名或功能的用戶,並且腳本的路徑將與用戶的歷史一樣。

0

在部署軟件包中提供助手腳本是一種非常常見的技術。認爲service apache2 restart完全符合你的描述。

相關問題