printenv.c很有意思的。代码同样简短,但有一个地方很怪,只是定义了一个外部变量,不是定义,只是声明。
extern char **environ;
后面就可以以打印全部环境变量
for (env = environ; *env != NULL; ++env)
puts (*env);
真是奇怪了。我找了environ,好象也只是一个宏,这个以后再细究。
开始我也不明白,这个命令究竟是做什么的,把代码本地编译一次,再执行,原来这个程序就是打印环境变量,不带参数,把全部环境变量打印;带参数,就把参数当环境变量打印出来。
其中把指定环境变量打印出来的那段,很有意思
for (i = optind; i < argc; ++i)
{
for (env = environ; *env; ++env)
{
ep = *env;
ap = argv[i];
while (*ep != '\0' && *ap != '\0' && *ep++ == *ap++)
{
if (*ep == '=' && *ap == '\0')
{
puts (ep + 1);
++matches;
break;
}
}
}
}
我开始没想明白,后来想,其逻辑是,如果argv[0] argv[1]
把argv[1]当成环境变量,在全部的环境变量中去找,找到后就打印。但环境变量在environ已经变量
环境变量=值
这种形式了,为此,要把=后的值剔出来,于是就弄这么复杂,我于是在while循环中,把ep当前所指字符打印出来,发现会吃掉一个字符,
我想是
while (*ep != '\0' && *ap != '\0' && *ep++ == *ap++)
{
printf("[%c]\n",*ep);
if (*ep == '=' && *ap == '\0')
{
puts (ep + 1);
++matches;
break;
}
}
应该是后面++的缘故。
很有意思。而matches来控制,若有环境变量没找到,就显示出错信息。我原来以为有几个环境变量没找到,就显示几。后来发现不管多少个环境变量没找到,退出时,都返回1,因为
exit_status = (matches != argc - optind);
exit (exit_status);
哈哈,有意思。
很有意思。而matches来控制,若有环境变量没找到,就显示出错信息。我原来以为有几个环境变量没找到,就显示几。后来发现不管多少个环境变量没找到,退出时,都返回1,因为
exit_status = (matches != argc - optind);
exit (exit_status);
哈哈,有意思。