[Bash] Prefix Shell Parameters

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.DEBUGcontroller-*

因此,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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容