src="binds.c engine.c console.c"
echo $src
gcc $src
上面的批处理文件适用于echo,但gcc失败。如果我输入
在命令行gcc $src
,这是有效的。所以gcc似乎没有在批处理文件中获取环境局部变量?
使用CYGWIN。
答案 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
,因此编译将按预期进行。
所以,关键点是:
export
。还有一些其他技巧可以用环境变量来提取,但它们与你的情况没有密切关系,而且比帮助更容易混淆。 (对于那些知道的人,我正在考虑set -k
和var=value cmd arg1 ...
。)