shell (bash) 中如何或以何种模式列出环境变量?

Mam*_*pac 1 bash shell environment

我的任务是为我的学校从头开始用 C 实现我自己的 shell。

作为参考,我必须采取bash

我的问题是,调用env或时如何列出环境变量?printenv

我注意到它既不是按创建日期排列,也不是按字母顺序排列。

我的 shell 有自己的环境 a char **,我想知道在声明新变量后应该如何对其进行洗牌,以便它bash正确模仿。

我尝试运行export a=aaaabash它出现在列表的中间。

Kam*_*Cuk 5

调用 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)

来自coreutils/printenv

  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.cVAR_CONTEXT.