当使用源代码编译应用程序时make
或cmake
说明通常会说,
source <some path> <parameter>
export <some text>
此外,还会出现很多 LD_LIBRARY_PATH
与 一起使用的情况export
。
source
和有什么区别export
?为什么我们需要它们?
答案1
shell 命令source
和export
确实是两码事。简而言之:
source
./myscript.sh
当您以正常方式(例如使用或)调用 shell 脚本时sh myscript.sh
,它将在其自己的进程上下文(新进程环境)中执行,因此脚本中设置的所有变量在调用 shell 中都不可用。使用 命令执行脚本时source
,它将在调用脚本的上下文中执行。这样,您可以通过调用 来设置环境变量source myscript
。
export
环境变量通常仅在当前进程的(本地)上下文中有效。因此,如果您执行某些请求新进程环境的程序(脚本或程序),则本地环境将不会在新进程中看到。要将环境值传递给子进程,您必须通过在赋值前加上 来“导出”它们export
,例如export VAR=value
。
export LD_LIBRARY_PATH
特殊环境变量LD_LIBRARY_PATH
定义了搜索可加载库的路径(类似于PATH
定义查找可执行文件位置的变量)。默认情况下,库在 等目录中搜索/lib
。/usr/lib
安装在非标准目录(例如/opt/program/lib
)中的库只有在本例中通过 额外定义这些路径时才能加载export LD_LIBRARY_PATH=/opt/program/lib
。您需要在此处导出,因为程序在其中运行的新进程环境必须知道这一点。
持久性
只要进程正在运行,进程环境就存在;这也适用于环境变量(当未明确取消设置时)。如果进程被终止(例如通过关闭终端窗口),通常所有子进程也会被终止,环境也会被删除。更准确地说,这取决于子进程对 的反应。如果没有,它将作为用户进程(例如)或 init 进程(PID=1)的SIGHUP
子进程继续运行。/sbin/upstart --user
让子进程克服父进程被终止的一种方法是使用nohup
命令将它们从父进程中释放出来(参见man nohup
),该命令不会传递SIGHUP
给子进程,并将该进程释放到后台:
nohup <progname> &
将从父进程中分离该进程,并将 STDIN 分配给/dev/null
并将 STDOUT 分配给./nohup.out
。