+ -
当前位置:首页 → 问答吧 → youbest的LFS大作 <<手把手教你如何建立自己的Linux系统>> 里的一个疑问

youbest的LFS大作 <<手把手教你如何建立自己的Linux系统>> 里的一个疑问

时间:2008-11-02

来源:互联网

在编译 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脚本一样能接受到同一个命令行上的变量定义呢?

作者: osborn_lix   发布时间: 2008-11-02

注意 shell 参数的扩展顺序

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

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

但换一种方式你就可以看到 CC 了:
代码:
$ CC="gcc -O2"
$ echo $CC
gcc -O2
为了验证我说的第一点,你可以自己编写一个小程序 arg.c
代码:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        char *s = getenv("CC");
        if (s == NULL)
 fprintf(stderr, "No environment variable named CC!\n");
        else
 printf("%s\n", s);
        exit(EXIT_SUCCESS);
}
编译运行:
代码:
$ gcc -g -Wall arg.c -o arg
$ unset CC
$ ./arg
No environment variable named CC!
$ CC="gcc -O2" ./arg
gcc -O2

作者: Vamperor   发布时间: 2008-11-02

收到了,多谢!!!!!!

作者: osborn_lix   发布时间: 2008-11-02

但想来想去还是有点不太明白

作者: osborn_lix   发布时间: 2008-11-02

这么说吧,echo 并不需要任何环境变量,因为在其代码中貌似只检查了 "POSIXLY_CORRECT" 环境变量以检测其是否开启扩展功能,你的 CC="gcc -O2" echo $CC 这句也没有为了 echo 设置任何环境变量,你只是设置一个环境变量再让 shell 来展开,因此用到该环境变量的是 shell 而不是 echo。而此时 shell 还不认识这个环境变量,因此会出现你的结果

作者: Vamperor   发布时间: 2008-11-03

2楼讲的很清楚,不过有点小问题。

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

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

作者: 聚焦深空   发布时间: 2008-11-03

引用:
作者: 聚焦深空

shell内建echo不等同于/bin/echo,
2楼的例子程序不适用这种情况,不过结果是一样的。
没注意到 嘿嘿。。。 多谢指出

作者: Vamperor   发布时间: 2008-11-03

努力学习一下
不过我还有个疑问,如果按照二楼解释,那我觉得
CC="gcc -O2" echo $CC
echo $CC
这样应该可以输出gcc -O2才对啊,因为第二次echo与CC="gcc -O2"不在一行阿,可是为什么这样输出也是空呢?

作者: skycleaner   发布时间: 2008-11-04

引用:
作者: skycleaner
努力学习一下
不过我还有个疑问,如果按照二楼解释,那我觉得
CC="gcc -O2" echo $CC
echo $CC
这样应该可以输出gcc -O2才对啊,因为第二次echo与CC="gcc -O2"不在一行阿,可是为什么这样输出也是空呢?
XX="xxx" cmd
环境变量仅对当前命令有效。

XX="xxx" cmd != XX="xxx"

作者: 聚焦深空   发布时间: 2008-11-06