Bash 中的内联变量赋值和常规变量赋值有什么区别?

What is the difference between an inline variable assignment and a regular one in Bash?

有什么区别:

prompt$   TSAN_OPTIONS="suppressions=/somewhere/file" ./myprogram

prompt$   TSAN_OPTIONS="suppressions=/somewhere/file"
prompt$   ./myprogram

thread-sanitizer 库给出了第一个案例,即如何让他们的库(在 myprogram 中使用)读取选项中给出的文件。我读了它,并假设它应该是两行,所以 运行 它是第二种情况。

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

有什么区别?

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

格式 VAR=value command 设置变量 VAR 在命令 command 的环境中具有值 value。涵盖此内容的规范部分是 Simple Commands。具体来说:

Otherwise, the variable assignments shall be exported for the execution environment of the command and shall not affect the current execution environment except as a side-effect of the expansions performed in step 4.

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

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

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

VAR=value
export VAR
command
unset -v VAR

完全不使用当前进程环境。

补充

区分shell变量和环境变量很重要:

注:以下适用于所有POSIX-compatibleshells; bash-特定的扩展被标记为这样。

A shell 变量 是一个 shell-specific 构造,仅限于 shell定义它的(subshells 除外,它有自己的 copies 当前 shell'变量),
environment 变量 由当前进程创建的 any child 进程 继承( shell),无论 child 进程本身是否是 shell。
请注意 all-uppercase variable names should only be used for environment variables.

无论哪种方式,child 进程只会继承 副本 变量,其修改(通过 child)会 影响parent.

  • 所有环境变量都是shell variables(shell 确保),
  • 逆运算不成立shell 变量不是环境变量,除非明确指定或继承 - 这种指定称为exporting
    • 请注意 off-by-default -a shell 选项(使用 set -a 设置,或作为 command-line 传递给 shell 本身选项)可用于 auto-export 所有 shell 变量。

因此,

  • 您通过赋值隐式创建的任何变量 - 例如,TSAN_OPTIONS="suppressions=/somewhere/file" - 仅是 shell 变量,但不是环境变量,
  • EXCEPT - 可能令人困惑 - 直接添加到命令前 - 例如TSAN_OPTIONS="suppressions=/somewhere/file" ./myprogram - 在这种情况下,它们只是 环境 变量, 仅对那个命令 有效。
    • Etan 的回答是这样描述的。

Shell变量成为环境变量以及在以下情况下:

  • 基于shell本身继承的环境变量,例如$HOME
  • shell 使用 export varName[=value] 显式创建的变量,或者在 bash 中也使用 declare -x varName[=value]
    • 相比之下,在 bash 中,使用不带 -xdeclare,或在函数中使用 local,只会创建 shell变量
  • shell 在 off-by-default -a shell 选项生效时隐式创建的变量(有限的例外)

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

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

# ...

TSAN_OPTIONS="suppressions=/somewhere/file" # updates *both* the shell and env. var.

  • export -p 打印所有环境变量
  • unset [-v] MYVAR 取消定义 shell 变量 $MYVAR 并将其作为环境变量删除(如果适用)。
  • bash中:
    • 您可以 "unexport" 一个给定的变量,而无需将其取消定义为具有 export -n MYVARshell 变量 - 这会删除 MYVAR 来自环境,但将其当前值保留为 shell 变量。
    • declare -p MYVAR 打印变量 $MYVAR 的当前值及其属性;如果输出以declare -x开头,则导出$MYVAR(是环境变量)