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=value
和 VAR=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
中,使用不带 -x
的 declare
,或在函数中使用 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 MYVAR
的 shell 变量 - 这会删除 MYVAR
来自环境,但将其当前值保留为 shell 变量。
declare -p MYVAR
打印变量 $MYVAR
的当前值及其属性;如果输出以declare -x
开头,则导出$MYVAR
(是环境变量)
有什么区别:
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=value
和 VAR=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 变量。
- 请注意 off-by-default
因此,
- 您通过赋值隐式创建的任何变量 - 例如,
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
中,使用不带-x
的declare
,或在函数中使用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 MYVAR
的 shell 变量 - 这会删除MYVAR
来自环境,但将其当前值保留为 shell 变量。 declare -p MYVAR
打印变量$MYVAR
的当前值及其属性;如果输出以declare -x
开头,则导出$MYVAR
(是环境变量)
- 您可以 "unexport" 一个给定的变量,而无需将其取消定义为具有