且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Node.js 获取 CLI 指定的环境变量

更新时间:2021-10-03 16:48:16

当我们在使用 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 的环境变量