Bash
在後台執行設置 env var 或定義函式的命令
> export foo=1 & [1] 9016 [1] + done export foo=1 > echo $foo >
我知道當你執行一個命令時
&
會產生一個新程序並且export foo=1
沒有在父 shell 中設置環境變數。然而,這可行嗎?特別是,我在 Node 和很多包上開發,比如執行 js 命令和動態設置完成,例如 grunt 和 gulp。那太慢了。
我正在考慮製作一個類似於autoenv的實用程序。當您輸入一個目錄時,它會在後台執行 js 命令和設置完成,並在
Gruntfile.js
或gulpfile.js
更改時重新執行等。那麼,如何非同步執行命令,並在它結束時為我定義環境變數和函式?
通過嚴格的解釋,你想做的事情是不可能的。所以問題是你要作弊多少才能完成這樣的事情?您需要 bash、一個 PROMPT_COMMAND 和兩個臨時文件。您還必須接受在後台任務完成後的命令之前不會更新 shell。我還建議在後台程序中使用 make,這樣冗長的任務只會在需要時執行。
首先設置您的事件掛鉤:
PROMPT_COMMAND='[[ -e file2 ]] && { . file2; rm file2 }'
然後關閉後台程序
(echo export foo=1 > file1 && mv file1 file2 )&
為什麼
mv
?file2 的存在表示任務已完成並且可以解析文件,因此您可以花時間建構 file1。