"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 命令是获取脚本而不是 运行 脚本的标准方法。
共有三个文件:
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 命令是获取脚本而不是 运行 脚本的标准方法。