Bash
在顯示第一個提示後,shell 是否可以(自動)源文件?
我想知道是否有任何方法可以在我的啟動文件中放入一些東西,這會導致在顯示第一個提示後獲取其他文件。
我更喜歡不依賴鉤子的方法,如
preexec
,precmd
或periodic
鉤子。(我正在使用 zsh,但我知道人們已經編寫了程式碼來將這些程式碼添加到 bash,通過一些巧妙的 hacktrap
或類似的東西。)我非常簡單的第一個測試(我沒想到它會起作用,但我覺得有必要嘗試一下,只是為了看到精確的結果)將它添加到我的
.zshrc
,{ sleep 100 && export VARIABLE_SET=1 } &
然後在shell載入後執行這個,在100秒之前和之後都過去了:
echo $VARIABLE_SET
當然,它(以及我能想到的每一種排列方式)都失敗了,並且沒有提供關於如何做到這一點的有希望的線索。
我希望啟動文件中的某些內容可以觸發影響 shell 的採購,即使它在第一個提示符下沒有立即可用。我想找到一種方法來延遲“昂貴”的採購,並讓提示快速出現,因為許多使啟動文件膨脹的東西都是不經常需要的東西。
我希望找到一種比使用鉤子更簡單的方法(但我已經使用鉤子創建了一個概念驗證
precmd
,以防沒有其他方法是可能的)。
你總是可以使用
sched
. 添加到您的~/.zshrc
sched +30 'source ~/.zsh/more-stuff'
並且
~/.zsh/more-stuff
將在啟動後 30 秒(或在 30 秒後的下一個提示處)獲取。
你不能使用這個
{...} &
想法,因為它&
會導致東西被放在一個子shell中;在那裡設置的變數不會影響父級。因此,我們可以將設置寫入臨時文件並將其讀入父級。
一種方法可能是使用 DEBUG 陷阱。
未經過全面測試,但可能類似於
( sleep 100 ; echo MYVAR=1 ; echo trap - DEBUG ) > ~/.slowstartfile.$$ trap '. ~/.slowstartfile.$$' DEBUG
DEBUG 陷阱通常在命令執行後呼叫。
所以
% ( sleep 10 ; echo MYVAR=1 ; echo trap - DEBUG ) > ~/.slowstartfile.$$ & [1] 9411 % trap 'source ~/.slowstartfile.$$' DEBUG % sleep 10 [1] + Done ( sleep 10 ; echo MYVAR=1 ; echo trap - DEBUG ) > ~/.slowstartfile.$$ & % echo $MYVAR 1