Bash

在顯示第一個提示後,shell 是否可以(自動)源文件?

  • May 28, 2022

我想知道是否有任何方法可以在我的啟動文件中放入一些東西,這會導致在顯示第一個提示後獲取其他文件。

我更喜歡不依賴鉤子的方法,如preexec,precmdperiodic鉤子。(我正在使用 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

引用自:https://unix.stackexchange.com/questions/694713