在kdb实例中删除环境变量的方法及相关疑问解答
KDB环境变量与
system命令问题解答 问题1:在kdb实例中如何删除环境变量?使用setenv[abc;""]`后,kdb中的输出与变量不存在时一致,但该环境变量是被实际删除还是仅被设为空值?
在KDB里,setenv[abc;""]只是把环境变量设为空值,并没有彻底删除它。要真正删除KDB进程内的环境变量,得用带负号前缀的语法:setenv[-abc]。
可以通过以下操作验证差异:
q)setenv[`abc;"test"] q)getenv`abc "test" q)setenv[-`abc] // 彻底删除变量 q)getenv`abc `abc // 返回变量名,说明变量已不存在
而如果用setenv[abc;""],执行getenvabc会返回空字符串,和变量不存在时返回变量名的结果本质不同——前者是变量存在但值为空,后者是变量本身不存在。
问题2:system命令是否在独立的操作系统终端中运行?
是的,KDB的system命令每次调用都会启动一个独立的子shell进程执行命令,子shell的环境和KDB主进程完全隔离:
- 子shell中对环境变量的修改不会同步到KDB主进程;
- 每次
system调用的子shell之间也不共享环境,前一次设置的变量不会保留到下一次调用。
你的示例正好能证明这一点:
第一个示例:
q)setenv[`acc;321] q)getenv`acc "321" q)system"unset acc" // 子shell中删除acc变量 q)getenv`acc "321" // KDB主进程的acc不受影响
第二个示例:
q)system"export adc=123; echo $adc" "123" // 当前子shell中设置并输出adc q)system"echo $adc" "" // 新的子shell中无adc变量,返回空
内容的提问来源于stack exchange,提问作者Rezzy
相关产品推荐
相关产品推荐

