"shell export" 在 makefile 中的表现

how "shell export" behave in makefile

共有三个文件:

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 总是创建一个子进程来执行命令。第一行命令和第二行命令有什么区别?

这与make无关;如果您直接从 shell 命令行 运行 这些命令,您会看到相同的行为。

当您 运行 像 ./test1.sh 这样的命令(无论它是如何完成的)调用一个新的 shell。 new shell 拥有父进程环境的新副本。当您在 ./test1.sh 中修改 LD_LIBRARY_PATH 时,您会修改该副本。然后 shell 退出,修改后的环境副本被销毁。请记住,在 POSIX/UNIX 环境中 不可能 永远 修改父进程的环境(直接)。

在第二个示例中,您首先在父环境中设置 LD_LIBRARY_PATH,然后调用 ./test2.sh,它复制了父环境,因此它继承了新设置。

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

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

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