LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3025|回复: 11

贴个小程序,打印环境变量

[复制链接]
发表于 2003-6-22 21:54:40 | 显示全部楼层 |阅读模式
prtenv命令行选项:
-i:不区分大小写

  1. [color=red]prtenv -i path[/color]
  2. path:
  3.   /home/lbc/sh:/home/lbc/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:
  4. /usr/games:/usr/j2sdk141_01/bin:
复制代码

-m:分行显示,有点问题,最后的.(当前目录)没显示出来

  1. [color=red]prtenv -im path[/color]
  2. path:
  3.   /home/lbc/sh
  4.   /home/lbc/bin
  5.   /usr/local/bin
  6.   /usr/bin
  7.   /bin
  8.   /usr/bin/X11
  9.   /usr/games
  10.   /usr/j2sdk141_01/bin
复制代码

-n:打印环境变量名

  1. [color=red]prtenv -n[/color]
  2. HZ, SSH_AGENT_PID, KDE_MULTIHEAD, SHELL, TERM, GS_LIB, GTK_RC_FILES,
  3. WINDOWID, HUSHLOGIN, QTDIR, KDE_STARTUP_ENV, USER, LS_COLORS,
  4. SSH_AUTH_SOCK, KDEDIR, SESSION_MANAGER, XPSERVERLIST, MAIL, PATH, PWD,
  5. JAVA_HOME, XMODIFIERS, LANG, COLORFGBG, SHLVL, HOME, LOGNAME, LC_CTYPE,
  6. DISPLAY, COLORTERM, XAUTHORITY, _, OLDPWD
复制代码

  1. /* prtenv.c
  2. * Binary Li
  3. * 2003-3-28
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>

  8. extern char **environ;
  9. int o_i, o_m, o_n; /* 命令行选项imn对应的变量 */
  10. char *o_d = ":"; /* 本来想加上命令行-d,自定义分隔符,后来发现用处不大,
  11.                   * 就没有实现 */

  12. void printenv(char *);
  13. void printname(void);

  14. int
  15. main(int argc, char *argv[])
  16. {
  17.   extern int optind;
  18.   char c, **en;
  19.   int i;

  20.   en = environ;
  21.   if(argc == 1){ /* 无命令行参数时打印全部环境变量 */
  22.     while(*en)
  23.       printf("%s\n", *en++);
  24.   }else{
  25.     while((c = getopt(argc, argv, "imn")) != -1){
  26.       switch(c){
  27.       case 'i':
  28.         o_i = 1;
  29.         break;
  30.       case 'm':
  31.         o_m = 1;
  32.         break;
  33.       case 'n':
  34.         o_n = 1;
  35.         break;
  36.       default:
  37.         fprintf(stderr, "usage: %s [-i|-m|-n] [environment]\n", argv[0]);
  38.         exit(-1);
  39.       }
  40.     }
  41.     if(o_n)
  42.       printname();
  43.     for(i = optind; i < argc; i++)
  44.       printenv(argv[i]);
  45.   }
  46.   
  47.   exit(0);
  48. }

  49. void
  50. printenv(char *s) /* 打印单个环境变量 */
  51. {
  52.   int (*cmp)(const char *, const char *, size_t);
  53.   char **en;
  54.   char *tmp, *t;
  55.   
  56.   en = environ;
  57.   
  58.   if(o_i) /* true:不区分大小写 */
  59.     cmp = strncasecmp;
  60.   else
  61.     cmp = strncmp;
  62.   while(*en){
  63.     if(!(*cmp)(s, *en, strlen(s)))
  64.       break;
  65.     en++;
  66.   }
  67.   
  68.   printf("%s:\n", s);
  69.   if(*en == NULL){
  70.     printf("  not found!\n");
  71.     return;
  72.   }
  73.   
  74.   tmp = (char *)malloc(strlen(*en) + 1); /* strtok会改变传入的字符串,
  75.                                           * 所以必须对副本操作 */
  76.   strcpy(tmp, *en);
  77.   t = strtok(tmp, "=");
  78.   if(o_m)
  79.     while((t = strtok(NULL, o_d)) != NULL)
  80.       printf("  %s\n", t);
  81.   else
  82.     printf("  %s\n", tmp + strlen(t) + 1);
  83.   free(tmp);
  84. }

  85. void
  86. printname(void) /* 打印所有环境变量名 */
  87. {
  88.   char **en, *t, tmp[80];
  89.   int f = 0;
  90.   
  91.   en = environ;
  92.   while(*en){
  93.     if(f) /* 避免输出最后一个变量名时后跟", " */
  94.       printf(", ");
  95.     else
  96.       f = 1;
  97.     strncpy(tmp, *en, 79);
  98.     t = strtok(tmp, "=");
  99.     printf("%s", t);
  100.     en++;
  101.   }
  102.   printf("\n");
  103. }
复制代码
发表于 2003-6-23 07:37:12 | 显示全部楼层
这个小工具可以和grep、awk、sed配合起来使用。
发表于 2003-6-23 11:16:19 | 显示全部楼层
有参考价值
发表于 2003-6-23 22:42:16 | 显示全部楼层
原来 L 版的大名是 Li Binary, 我以前还以为是 Lib* 失礼了!
发表于 2003-6-23 23:13:12 | 显示全部楼层
同感
我以前也这么认为的^_^
 楼主| 发表于 2003-6-23 23:17:09 | 显示全部楼层
呵呵,我叫李斌,但是网上注册的libin太多了,几乎注册不到,我就把bin扩展成binary了。
 楼主| 发表于 2003-6-23 23:22:49 | 显示全部楼层
这个程序的输出让我有点不满意,给出的是带格式的输出,看是好看了一点,不过用在命令行管道里就多了一些没用的格式化信息(如path:,行头的空格),似乎应该加个选项控制格式化信息的输出。
发表于 2003-6-24 08:45:54 | 显示全部楼层
谢谢楼主了,可以从这个程序中学到不少东西。入门的好东西。
发表于 2003-6-24 12:10:30 | 显示全部楼层
最初由 libinary 发表
呵呵,我叫李斌,但是网上注册的libin太多了,几乎注册不到,我就把bin扩展成binary了。


网上ID太少
还好这边无双还可以用就注册了一个
发表于 2003-6-24 13:44:42 | 显示全部楼层
论坛已经有人注册了一个叫天下无双的ID,如果无双兄不抓紧时间,真有被人抢注的危险。呵呵。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表