在程序执行的同一行设置环境变量与单独设置不同? - shell变量与环境变量

use*_*689 22 bash shell environment-variables command-line-arguments

有什么区别:

prompt$   TSAN_OPTIONS="suppressions=/somewhere/file" ./myprogram
Run Code Online (Sandbox Code Playgroud)

prompt$   TSAN_OPTIONS="suppressions=/somewhere/file"
prompt$   ./myprogram
Run Code Online (Sandbox Code Playgroud)

线程消毒图书馆给人的第一情况下,如何让自己的图书馆(myprogram内使用)来读取选项中指定的文件.我读了它,并假设它应该是两个单独的行,所以运行它作为第二种情况.

在第二种情况下,库不使用该文件,其中环境变量和程序执行在不同的行上.

有什么不同?

奖金问题:第一种情况如何运行没有错误?不应该有一个; 或&&他们之间?这个问题的答案可能会回答我的第一个......

Eta*_*ner 25

格式VAR=value command将变量设置为在命令的环境中VAR具有值.涵盖此内容的规范部分是简单命令.特别:valuecommand

否则,应为命令的执行环境导出变量赋值,除了作为步骤4中执行的扩展的副作用外,不应影响当前的执行环境.

该格式在当前shell中VAR=value; command设置shell变量,然后作为子进程运行.子进程对shell进程中设置的变量一无所知.VARcommand

进程导出(提示提示)子进程可以看到的变量的机制是在运行子进程之前在其环境中设置它们.内置的shell就是这样做的export.这就是为什么你经常看到export VAR=valueVAR=value; export VAR.

您正在讨论的语法是类似于以下内容的简短形式:

VAR=value
export VAR
command
unset -v VAR
Run Code Online (Sandbox Code Playgroud)

只是没有使用当前的流程环境.

  • 正确,`export`将*变量*标记为导出而不是当前值.因此,即使更改了值,也只需要导出一次变量. (2认同)
  • 您可以运行`export -p`或`declare -x`来查看导出变量的当前列表(及其当前值). (2认同)

mkl*_*nt0 20

补充Etan Reisner的有用答案:

这是区分重要的外壳变量和环境变量:

注意:以下内容适用于所有 POSIX兼容的shell; bash特定扩展名标记为这样.

一个外壳变量是一个特定的壳结构,它被限制在定义它(与外壳子shell,其中获得自己的副本当前shell的变量),
而一个环境变量被继承任何子进程被创建当前进程(shell),该子进程本身是否为shell.
请注意,全大写变量名称只应用于环境变量.

无论哪种方式,一个子进程永远只继承了副本的变量,其修饰(根据孩子)并不会影响.

  • 所有环境变量也是 shell变量(shell确保),
  • 反之亦然:shell变量不是环境变量,除非明确指定或继承,否则这个名称称为导出.
    • 请注意,默认情况下的-ashell选项(使用set -a或作为命令行选项传递给shell本身)可用于自动导出所有shell变量.

从而,

  • 你通过赋值隐式创建的任何变量- 例如,TSAN_OPTIONS="suppressions=/somewhere/file"- 只是shell变量,但不是环境变量,
  • 除了 - 可能是令人困惑的 - 直接在命令之前 - 例如TSAN_OPTIONS="suppressions=/somewhere/file" ./myprogram- 在这种情况下它们只是环境变量,仅对THAT COMMAND有效.
    • 这就是Etan的回答所描述的.

在以下情况下,Shell变量也会成为环境变量:

  • 基于shell本身继承的环境变量,例如 $HOME
  • 使用export varName[=value]or,in bash,with with 显式创建的shell变量declare -x varName[=value]
    • 相比之下,在函数中bash使用,declare不使用-xlocal在函数中使用,只会创建shell变量
  • 在默认情况下的-ashell选项生效时隐式创建的shell变量(有限的例外情况)

一旦shell变量被标记为已导出 - 即标记为环境变量 - 对shell变量的任何后续更改也会更新环境变量 ; 例如:

export TSAN_OPTIONS  # creates shell variable *and* corresponding environment variable

# ...

TSAN_OPTIONS="suppressions=/somewhere/file" # updates *both* the shell and env. var.
Run Code Online (Sandbox Code Playgroud)
  • export -p 打印所有环境变量
  • unset [-v] MYVAR$MYVAR取消定义shell变量,并将其作为环境变量删除(如果适用).
  • bash:
    • 您可以"取消导出"某个给定变量,而不会将其作为shell变量取消定义export -n MYVAR- 这会MYVAR从环境中删除,但会将其当前值保留为shell变量.
    • declare -p MYVAR打印变量$MYVAR的当前值及其属性; 如果输出开头declare -x,$MYVAR则导出(是环境变量)