0

(免责声明:这是作业)

我正在创建一个 shell 程序,我们称之为fancysh。我正在尝试将 PATH(和其他环境变量)功能添加到我的 shell 中,到目前为止一切都很好。我天真的方法是将所有这些变量作为静态变量存储在 fancysh.c 中。但是现在我正在尝试实现环境变量 SHLVL ,它保存了当前的“深度”外壳。例如,我可以在 fancysh 的第一个实例中运行,并且 SHLVL 应该读取 1,在再次调用 fancysh 时,SHVLL 应该增加(并且在退出 shell 时减少)。

我尝试过的...

花哨的.h

#ifndef FANCYSH_H
#define FANCYSH_H

extern int SHLVL;

#endif

花式的.c

#include "fancysh.h"

int SHLVL;

int main(){

 /* some fancy code to determine if SHLVL is initalized */
 /* if not init to 0 */

 SHLVL ++;
 printf("%d\n", SHLVL);

 /* Test Code Only */
 int pid = fork();
 if(pid == 0 && SHLVL < 10)
   exec("fancysh");
 wait();
 /* Test Code Only */

 /*  shell code */
 SHLVL--;
 printf("%d\n", SHLVL);
 exit(0);
}

我在这里这里使用了答案作为这个解决方案的一部分。

那么我将如何实现花哨的代码来确定 SHLVL 是否已初始化?我对使用 and 的组合有一些想法#ifdef#define但我不是 100% 确定如何做到这一点。

4

1 回答 1

0

您需要了解不同的 shell 进程是不同的进程这一事实。仅仅因为一个 shell 实例是在另一个 shell 实例的范围内启动的,并不意味着前者会自动继承后者的任何数据。

或者不直接,反正。您的 shell 的任何新实例都将从启动它的进程接收环境。如果该环境包含一个SHLVL变量,那么新的 shell 进程当然可以读取该值,并且它可能会在其自己的范围内呈现该环境变量的不同值。

于 2016-02-04T22:53:08.083 回答