我有一個腳本改變了另一個程序的一些東西,其中一個是用一組不同的標誌調用所述程序。
標誌很長,容易出錯並且難以記住,所以我寫的這個腳本想要覆蓋該可執行文件,這樣當用戶調用腳本時,它實際上會調用腳本以及額外的複雜參數。
我知道的至少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
方法將工作(例如,宣佈那些在bashrc
或zshrc
)。同樣重要的是要注意,這些更改應該只是臨時的,並且用戶可能會或可能不想要設置它。更多理由不應將這些更改添加到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
以前。
因此,我發現兩個第一項(alias
和function
)不夠充分,第三個(更改$PATH
)是不可靠的。
我知道必須有一個正確的方法來做到這一點,我理解子shell的侷限性,並改變一個腳本中的內容並使它們保持不變,但會提示用戶「源文件修改爲$PATH
或export PATH=/path/to/foo:$PATH
「使這個可靠的唯一方法?
經常變化的冗長複雜的論點?聽起來像'ghostscript'。無論如何,我會將'/ usr/local/bin/whatever'移動到'/ usr/local/bin/whatever.installed'上,然後在''/ usr/local/bin/exec'安裝的版本。 – bishop