環境変数
HOMEやUSERなど,環境変数に応じた処理をしたくなることもあろう.なので,環境変数を取得したり設定したりできると嬉しい.
環境変数の取得と設定にはgetenvとputenvを使用する.以下例.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int opt;
int result;
char **parameter;
char *variable;
char *string;
/* -gと-sの二種類のオプションを取る */
opt=getopt(argc,argv,"gs");
switch(opt){
/* -gは続く引数に環境変数を指定して,その値を出力する. */
case 'g':
for(;optind<argc;optind++){
fprintf(stdout,"%s = %s\n",argv[optind],getenv(argv[optind]));
}
break;
/* -sは続く引数(variable=valueの形式)で環境変数を設定する. */
case 's':
for(;optind<argc;optind++){
/* 環境変数を設定 */
if(putenv(argv[optind])!=0){
fprintf(stderr,"input : %s\n",argv[optind]);
fprintf(stderr,"format: variable=value\n");
exit(1);
}
*parameter=argv[optind];
/* 引数の左辺を取り出す */
variable=strsep(parameter,"=");
/* 設定した環境変数を出力 */
fprintf(stdout,"%s = %s\n",variable,getenv(variable));
}
break;
case '?':
fprintf(stderr,"Usage :\n");
fprintf(stderr,"\t-s set environment\n");
fprintf(stderr,"\t-g get environment\n");
exit(1);
}
exit(0);
}
これを実行すると,以下のようになる.
$> ./environ -g HOME USER HOGE HOME = /home/matsu USER = username HOGE = (null) $> ./environ -s HOGE=HOGE FUGA=FUGA HOGE = (null) FUGA = (null)putenvを使う方(-s)の方がなんだか失敗している.原因は不明.
プログラム中で環境変数を変更しても,コマンドプロンプトに戻ったらその変更は反映されない.つまり子プロセスの変更は親プロセスには反映されない.具体例を以下に示す.
#include <stdio.h>
int main(int argc,char *argv[])
{
fprintf(stdout,"HOGE=%s\n",getenv("HOGE"));
putenv("HOGE=hoge");
fprintf(stdout,"HOGE=%s\n",getenv("HOGE"));
exit(0);
}
これを実行してechoとかしてみる.
> ./environ2 HOGE=(null) HOGE=hoge $> echo $HOGEと,上のプログラムを実行してputenv("HOGE=hoge")しても親プロセスであるshellにもどってecho $HOGEしても$HOGEが設定されていないことになっている.

