當我們在使用 Node.js 開發 CLI 的時候,可能碰到的問題是,想知道用戶設置了哪些環境變量,或者用戶對環境變量做了哪些修改。本文提供一個通用的簡單思路來處理這個問題。
首先想要獲取用戶新設置的或者修改過的環境變量,就需要有個參照對象,也就是舊的環境變量,那麼就需要獲取默認的,原本的環境變量。
我們都知道在 *nix 系統中,一個進程被創建的本質是從父進程 fork 一個一模一樣的過程,CLI 中執行一個 Node 腳本,本質是 shell 在 fork 一個新進程,而這個 fork 的過程中子進程的默認環境變量通常是從父進程繼承而來 —— 也即,想要獲取當前進程的默認環境變量,只需要獲取父進程當前的環境變量即可。
父進程的環境變量,可以通過 ps 命令獲取,例如:
$ node
Welcome to Node.js v13.11.0.
Type ".help" for more information.
> child_process.execSync('ps eww -o command "' + process.ppid + '"').toString()
就可以獲取到結果:
COMMAND
-zsh TERM_SESSION_ID=w1t0p0:7762E31B-9E3B-49F5-8854-13C984A1DB2E SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.tLslpJYN8w/Listeners LC_TERMINAL_VERSION=3.3.9 Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.3MB4xNxZF1/Render COLORFGBG=7;0 ITERM_PROFILE=Default XPC_FLAGS=0x0 PWD=/Users/lellansinhuang/workspace/function-runtime SHELL=/bin/zsh SECURITYSESSIONID=186a7 LC_CTYPE=UTF-8 TERM_PROGRAM_VERSION=3.3.9 TERM_PROGRAM=iTerm.app PATH=/usr/bin:/bin:/usr/sbin:/sbin LC_TERMINAL=iTerm2 COLORTERM=truecolor COMMAND_MODE=unix2003 TERM=xterm-256color HOME=/Users/lellansinhuang TMPDIR=/var/folders/rs/kwwwgtmx02gcwk2pglb95yj40000gp/T/ USER=lellansinhuang XPC_SERVICE_NAME=0 LOGNAME=lellansinhuang ITERM_SESSION_ID=w1t0p0:7762E31B-9E3B-49F5-8854-13C984A1DB2E __CF_USER_TEXT_ENCODING=0x1F6:0x0:0x0
這個是 ps 命令出來的格式,需要通過 split 等方式處理一下才能變成 json 格式。拿到這個數據之後,在於當前進程的 process.env 中的當前進程的環境變量進行 diff 操作,即可獲取到:
- 用戶新加的環境變量
- 用戶修改的環境變量
- 用戶當前 shell 下新 export 的環境變量