有三个文件:
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始终创建一个子进程来执行命令。第一行命令和第二行之间有什么区别?
答案 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命令是获取脚本而不是运行脚本的标准方法。