src="binds.c engine.c console.c"
echo $src
gcc $src
上面的批处理文件的工作原理与回声,但海合会失败。如果我在命令行输入 gcc $src
,那就行了。所以看来,gcc不会在批处理文件中获得环境局部变量?GCC UNIX环境变量
使用CYGWIN。
src="binds.c engine.c console.c"
echo $src
gcc $src
上面的批处理文件的工作原理与回声,但海合会失败。如果我在命令行输入 gcc $src
,那就行了。所以看来,gcc不会在批处理文件中获得环境局部变量?GCC UNIX环境变量
使用CYGWIN。
如果您使用的是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
,因此编译将按预期发生。
所以,关键点是:
export
。还有一些其他技巧可以通过环境变量来提取,但它们与您的情况没有密切关系,并且可能比帮助更容易混淆。 (我在想set -k
和var=value cmd arg1 ...
对于那些谁知道。)
哇,外壳问题,我正在Windows中运行cygwin。谢谢你们,你已经清除了一个谜。 – 2012-01-30 20:47:41
你'出口'变量? – 2012-01-29 19:11:17
不工作说什么? – 2012-01-29 19:11:23
出口?这是在同一个脚本,我可以告诉的问题。 – 2012-01-29 19:11:54