Bash

在後台執行設置 env var 或定義函式的命令

  • April 19, 2015
> export foo=1 &
[1] 9016
[1] + done      export foo=1
> echo $foo

>

我知道當你執行一個命令時&會產生一個新程序並且export foo=1沒有在父 shell 中設置環境變數。然而,這可行嗎?

特別是,我在 Node 和很多包上開發,比如執行 js 命令和動態設置完成,例如 grunt 和 gulp。那太慢了。

我正在考慮製作一個類似於autoenv的實用程序。當您輸入一個目錄時,它會在後台執行 js 命令和設置完成,並在Gruntfile.jsgulpfile.js更改時重新執行等。

那麼,如何非同步執行命令,並在它結束時為我定義環境變數和函式?

通過嚴格的解釋,你想做的事情是不可能的。所以問題是你要作弊多少才能完成這樣的事情?您需要 bash、一個 PROMPT_COMMAND 和兩個臨時文件。您還必須接受在後台任務完成後的命令之前不會更新 shell。我還建議在後台程序中使用 make,這樣冗長的任務只會在需要時執行。

首先設置您的事件掛鉤:

PROMPT_COMMAND='[[ -e file2 ]] && { . file2; rm file2 }'

然後關閉後台程序

(echo export foo=1 > file1 && mv file1 file2 )&

為什麼mv?file2 的存在表示任務已完成並且可以解析文件,因此您可以花時間建構 file1。

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