gcc unix环境变量

时间:2012-01-29 19:08:24

标签: unix cygwin

src="binds.c engine.c console.c"
echo $src
gcc $src

上面的批处理文件适用于echo,但gcc失败。如果我输入 在命令行gcc $src,这是有效的。所以gcc似乎没有在批处理文件中获取环境局部变量?

使用CYGWIN。

1 个答案:

答案 0 :(得分:1)

如果您正在使用Cygwin,那么您将在Unix仿真中运行Windows。一个非常好的,但仍然是一个仿效。但是,你也可能使用bash作为你的shell,这很好(如果你使用Korn shell,我在下面说的内容同样适用,如果你使用/bin/sh ,这实际上是bash的一个子集,我所说的也适用于此。

请注意,您可以在shell中定义不在shell环境中的变量。在运行其他脚本时,这种区别非常重要。

src="binds.c engine.c console.c"

这会创建一个名为src的非环境变量。您现在可以在命令行中使用它:

echo $src
gcc -c $src

echo命令将列出三个名称,GCC将运行并将尝试编译所有三个源文件。但是,如果运行env命令,则不会在环境中看到src。另一方面,如果您运行set命令,则会看到src

env    # No arguments - list the environment variables that are exported
set    # No arguments - lists variables, exported and non-exported

现在假设您在当前目录中拥有(或创建)名为compile的脚本,该脚本包含:

gcc -c $src

脚本应该是可执行的(chmod +x compile)。如果您运行:

./compile

脚本没有看到变量$src,因为它未导出,因此您收到的错误是没有从GCC指定的文件名。有趣的是,如果你运行其中任何一个:

. ./compile
source ./compile

然后根据需要进行编译。这是因为当前shell不是启动子shell来执行脚本,而是读取脚本,并定义了变量src

如果您现在导出src,它将可用于子shell和其他程序:

export src     # Sufficient given the initial assignment
export src="binds.c engine.c console.c" # Set and export; not portable to Bourne shell

现在,如果您运行env,您会看到列出src。现在,如果运行./compile,它的环境中将有一个变量src,因此编译将按预期进行。

所以,关键点是:

  • 并非所有shell变量都是环境变量。
  • 要将变量变为环境变量,必须明确export

还有一些其他技巧可以用环境变量来提取,但它们与你的情况没有密切关系,而且比帮助更容易混淆。 (对于那些知道的人,我正在考虑set -kvar=value cmd arg1 ...