2012-01-29 90 views
0
src="binds.c engine.c console.c" 
echo $src 
gcc $src 

上面的批处理文件的工作原理与回声,但海合会失败。如果我在命令行输入 gcc $src,那就行了。所以看来,gcc不会在批处理文件中获得环境局部变量?GCC UNIX环境变量

使用CYGWIN。

+1

你'出口'变量? – 2012-01-29 19:11:17

+2

不工作说什么? – 2012-01-29 19:11:23

+4

出口?这是在同一个脚本,我可以告诉的问题。 – 2012-01-29 19:11:54

回答

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,使您能子壳等程序:

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 ...对于那些谁知道。

+0

哇,外壳问题,我正在Windows中运行cygwin。谢谢你们,你已经清除了一个谜。 – 2012-01-30 20:47:41