1. Background
当使用某个框架进行node开发时,控制台上可能会输出一堆系统日志,
这些日志中,大多数是我们不关心的,
我们自己用console.log
写的日志,也会淹没其中。
debug是一个日志库,
它可以用颜色来区分不同的日志。
例如:
// controller/main.js
const log = require('debug')('controller-main');
log('main');
// controller/register.js
const log = require('debug')('controller-register');
log('register');
它可以指明不同的日志类型,
在本例中同一个文件中使用的日志类型相同,
第一个文件中,日志类型为controller-main
,第二个为controller-register
。
最后,我们就可以用以下方式启动node应用了。
$ DEBUG=controller-* npm run dev
> controller-main main +0ms
controller-register register +0ms
控制台上会用不同颜色的日志来进行区分。
如果不开启DEBUG
,则不会显示日志,
$ npm run dev
>
确实很好用,但是却给我们留下了一个疑问,
DEBUG=controller-*
是如何生效的呢?
2. Environment Variables
我们知道,node可以通过process.env
获取环境变量。
例如,
// index.js
console.log(process.env.SHELL);
$ node index.js
> /bin/zsh
它将打印出SHELL
环境变量的值。
回到原来的问题,
我们发现前置参数DEBUG=controller-*
,
是可以影响process.env.DEBUG
值的。
即DEBUG=controller-* node index.js
这样调用,
就可以在index.js
中获取到process.env.DEBUG
为controller-*
。
因此,debug使用了process.env
,
来获取用户传入的前置参数。
并且,除了node之外,npm也接受npm-config: environment variables。
那还是有问题,
这种前置参数的调用方式是node独有的吗?
3. Bash Environment
实际上,前置参数是Bash命令的一部分,
在Bash Reference Manual - 3.7.4 Environment中,
我们可以找到这样一句话,
The environment for any simple command or function may be augmented temporarily by prefixing it with parameter assignments, as described in Shell Parameters. These assignment statements affect only the environment seen by that command.
即这些前置参数会传递给当前命令,
例如,
$ a=1 bash -c 'echo $a'
> 1
注意,a=1 echo $a
是不行的,
因为a=1
是传递给echo
命令的,而不是在SHELL中设置变量。
StackExchange: Why is setting a variable before a command legal in bash?
参考
Github: visionmedia/debug
Working with Environment Variables in Node.js
Bash Reference Manual