源与导出与导出 LD_LIBRARY_PATH

源与导出与导出 LD_LIBRARY_PATH

当使用源代码编译应用程序时makecmake说明通常会说,

source <some path> <parameter>

export <some text>

此外,还会出现很多 LD_LIBRARY_PATH与 一起使用的情况export

source和有什么区别export?为什么我们需要它们?

答案1

shell 命令sourceexport确实是两码事。简而言之:

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

相关内容