两者有何不同:在与命令相同的行声明环境变量与声明 env。变种。然后 运行 命令

How does the two differ: Declaring an environment variable at the same line as the command vs. declaring the env. var. and then run the command

我用共享库编译了一个C程序。我不明白为什么

$ LD_LIBRARY_PATH=<path_to_lib> ./a.out

有效;还

$ LD_LIBRARY_PATH=<path_to_lib>
$ ./a.out

不会。

两行方法以前有时对我有用。所以我感到很困惑。

我假设你的意思是 LD_LIBRARY_PATH,但无论哪种方式,答案都是一样的:

有两种类型的变量与此上下文相关:

  1. Non-environment 变量,它们在当前 shell 的上下文中设置并且不会持续到子 shell 中。有时这些被称为“shell 变量”或“局部变量”,但这些术语可以有其他含义。
  2. 环境变量,在当前 shell 中设置并保留到从当前 shell 产生的子 shell 的上下文中。它们可以用“env”命令显示。

post 中的第一个 (one-liner) 命令将 LD_LIBRARY_PATH 设置为环境变量,但仅用于在同一行调用 a.out。 a.out运行在一个subshell中,可以看到LD_LIBRARY_PATH的值(因为是环境变量)。 a.out 完成后,设置的 LD_LIBRARY_PATH 超出范围。

第二组命令将LD_LIBRARY_PATH设置为non-environment变量,即该变量仅在当前shell可用。因为当你调用它时 a.out 在子 shell 中运行,它不会看到 LD_LIBRARY_PATH 的值。您需要在 LD_LIBRARY_PATH= 之前加上“导出”,使其成为环境变量,如下所示。

$ cat ./a.out
#!/bin/bash
env | grep LD_LIBRARY_PATH
echo $LD_LIBRARY_PATH

# LD_LIBRARY_PATH is treated as an environment variable
$ LD_LIBRARY_PATH=/usr/lib ./a.out
LD_LIBRARY_PATH=/usr/lib
/usr/lib

# LD_LIBRARY_PATH is NOT set as an environment variable
$ LD_LIBRARY_PATH=/usr/lib
$ ./a.out

# "export" sets LD_LIBRARY_PATH as an environment variable
$ export LD_LIBRARY_PATH
$ ./a.out
LD_LIBRARY_PATH=/usr/lib
/usr/lib
$