LinuxSir.cn,穿越时空的Linuxsir!

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

youbest的LFS大作 <<手把手教你如何建立自己的Linux系统>&

[复制链接]
发表于 2008-11-2 15:19:27 | 显示全部楼层 |阅读模式
在编译 Binutils-2.17 - Pass 1的过程中,有一命令是这样写的
CC="gcc -B/usr/bin/" ../binutils-2.17/configure --prefix=/tools --disable-nls --disable-werror
目的是生成Binutils的Makefile文件,以供下阶段的make程序编译使用。
但使我不明白的是在命令行上多了一个 CC="gcc -B/usr/bin/" 我猜应该是在运行configure脚本时向其初始化一个CC变量,以供其使用。
于是我想试试这个Bash特性,于是我在命令行上敲了一个
$ CC="gcc -O2" echo $CC
但命令行上却打印了一个空行,为什么echo程序不像configure脚本一样能接受到同一个命令行上的变量定义呢?
发表于 2008-11-2 16:09:28 | 显示全部楼层
注意 shell 参数的扩展顺序

对于你这条 CC="gcc -O2" echo $CC 来说,CC 的确是作为一个环境变量传给 echo 了,但是 echo 并没有用到这个变量!!

用到这个变量的是 shell,shell 在解释这一行的时候就把 $CC 扩展开作为参数传给 echo,但此时 CC 变量并没有定义,因为你给的 CC 定义在同一行,shell 还来不及从它已知的变量列表中找到它。

但换一种方式你就可以看到 CC 了:
  1. $ CC="gcc -O2"
  2. $ echo $CC
  3. gcc -O2
复制代码

为了验证我说的第一点,你可以自己编写一个小程序 arg.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5.         char *s = getenv("CC");
  6.         if (s == NULL)
  7.                 fprintf(stderr, "No environment variable named CC!\n");
  8.         else
  9.                 printf("%s\n", s);
  10.         exit(EXIT_SUCCESS);
  11. }
复制代码

编译运行:
  1. $ gcc -g -Wall arg.c -o arg
  2. $ unset CC
  3. $ ./arg
  4. No environment variable named CC!
  5. $ CC="gcc -O2" ./arg
  6. gcc -O2
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-2 16:44:06 | 显示全部楼层
收到了,多谢!!!!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-2 17:29:18 | 显示全部楼层
但想来想去还是有点不太明白
回复 支持 反对

使用道具 举报

发表于 2008-11-2 21:00:54 | 显示全部楼层
这么说吧,echo 并不需要任何环境变量,因为在其代码中貌似只检查了 "OSIXLY_CORRECT" 环境变量以检测其是否开启扩展功能,你的 CC="gcc -O2" echo $CC 这句也[color="Red"]没有为了 echo 设置任何环境变量,你只是设置一个环境变量再让 shell 来展开,因此用到该环境变量的是 shell 而不是 echo。而此时 shell 还不认识这个环境变量,因此会出现你的结果
回复 支持 反对

使用道具 举报

发表于 2008-11-2 22:09:48 | 显示全部楼层
2楼讲的很清楚,不过有点小问题。

一般系统上至少有两个版本的echo,
coreutils软件包中有一个,一般安装到/bin/echo,
shell一般内建有一个echo,如bash内建有echo,
不指明绝对路径时,shell优先使用内建版本。

shell内建echo[color="Red"]不等同于/bin/echo,
2楼的例子程序不适用这种情况,不过结果是一样的。
回复 支持 反对

使用道具 举报

发表于 2008-11-2 23:19:33 | 显示全部楼层
Post by 聚焦深空;1902982


shell内建echo[color="Red"]不等同于/bin/echo,
2楼的例子程序不适用这种情况,不过结果是一样的。


没注意到 嘿嘿。。。 多谢指出
回复 支持 反对

使用道具 举报

发表于 2008-11-4 17:50:02 | 显示全部楼层
努力学习一下
不过我还有个疑问,如果按照二楼解释,那我觉得
CC="gcc -O2" echo $CC
echo $CC
这样应该可以输出gcc -O2才对啊,因为第二次echo与CC="gcc -O2"不在一行阿,可是为什么这样输出也是空呢?
回复 支持 反对

使用道具 举报

发表于 2008-11-5 19:33:01 | 显示全部楼层
Post by skycleaner;1903869
努力学习一下
不过我还有个疑问,如果按照二楼解释,那我觉得
CC="gcc -O2" echo $CC
echo $CC
这样应该可以输出gcc -O2才对啊,因为第二次echo与CC="gcc -O2"不在一行阿,可是为什么这样输出也是空呢?

XX="xxx" cmd
环境变量仅对当前命令有效。

XX="xxx" cmd != XX="xxx"
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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