“shell导出”在makefile中的行为方式

时间:2015-03-09 07:13:30

标签: makefile export environment

有三个文件:

test1.sh:

#!/bin/sh
export LD_LIBRARY_PATH=/usr/local/lib1

test2.sh:

#!/bin/sh
echo $LD_LIBRARY_PATH

生成文件:

.PHONY : all
all:
    ./test1.sh && ./test2.sh
    export LD_LIBRARY_PATH=/usr/local/lib1 && ./test2.sh

结果:

./test1.sh && ./test2.sh
/usr/local/lib
export LD_LIBRARY_PATH=/usr/local/lib1 && ./test2.sh
/usr/local/lib1

makefile始终创建一个子进程来执行命令。第一行命令和第二行之间有什么区别?

1 个答案:

答案 0 :(得分:0)

这与make没有任何关系;如果直接从shell命令行运行这些命令,则会看到相同的行为。

当您运行调用新shell的./test1.sh命令(无论它如何完成)时。新shell具有父进程环境的新副本。在LD_LIBRARY_PATH内修改./test1.sh时,您可以修改该副本。然后shell退出,并且修改了环境的修改副本。请记住,在POSIX / UNIX环境中不可能 永远修改父进程的环境(直接)。

在第二个示例中,您首先在父级环境中设置LD_LIBRARY_PATH,然后调用./test2.sh生成父级环境的副本,以便继承新设置。

如果您想要一个修改当前shell环境的脚本,必须使用源操作来运行它;这会导致当前shell运行脚本而不是创建一个新的shell来运行脚本:

. ./test1.sh && ./test2.sh

. shell命令是获取脚本而不是运行脚本的标准方法。