Mam*_*pac 1 bash shell environment
我的任务是为我的学校从头开始用 C 实现我自己的 shell。
作为参考,我必须采取bash。
我的问题是,调用env或时如何列出环境变量?printenv
我注意到它既不是按创建日期排列,也不是按字母顺序排列。
我的 shell 有自己的环境 a char **,我想知道在声明新变量后应该如何对其进行洗牌,以便它bash正确模仿。
我尝试运行export a=aaaa,bash它出现在列表的中间。
调用 env 或 printenv 时如何列出环境变量?
这两个程序都是开源的。来自coreutlis/env.c:
char *const *e = environ;
while (*e)
printf ("%s%c", *e++, opt_nul_terminate_output ? '\0' : '\n');
Run Code Online (Sandbox Code Playgroud)
for (env = environ; *env != NULL; ++env)
printf ("%s%c", *env, opt_nul_terminate_output ? '\0' : '\n');
Run Code Online (Sandbox Code Playgroud)
我注意到它既不是按创建日期排列,也不是按字母顺序排列。
检查glibc/setenv.c我认为它会在末尾附加值,并保留一个#include <search.h>带有变量名称的单独的二叉搜索树 ( ) 以进行快速搜索。
Posix 来自https://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html的状态:
环境中的字符串顺序没有任何意义。
我认为这足以让实现自由地使用他们想要的任何顺序。
在 bash 中,它出现在列表的中间。
Bash 没有理由使用环境。Bash 有自己的export_env 2d 数组,并且使用自己的HASH_TABLE实现 - hashlib.c和VAR_CONTEXT.