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
具有值.涵盖此内容的规范部分是简单命令.特别:value
command
否则,应为命令的执行环境导出变量赋值,除了作为步骤4中执行的扩展的副作用外,不应影响当前的执行环境.
该格式在当前shell中VAR=value; command
设置shell变量,然后作为子进程运行.子进程对shell进程中设置的变量一无所知.VAR
command
进程导出(提示提示)子进程可以看到的变量的机制是在运行子进程之前在其环境中设置它们.内置的shell就是这样做的export
.这就是为什么你经常看到export VAR=value
和VAR=value; export VAR
.
您正在讨论的语法是类似于以下内容的简短形式:
VAR=value
export VAR
command
unset -v VAR
Run Code Online (Sandbox Code Playgroud)
只是没有使用当前的流程环境.
mkl*_*nt0 20
这是区分重要的外壳变量和环境变量:
注意:以下内容适用于所有 POSIX兼容的shell; bash
特定扩展名标记为这样.
一个外壳变量是一个特定的壳结构,它被限制在定义它(与外壳子shell,其中获得自己的副本当前shell的变量),
而一个环境变量被继承任何子进程被创建当前进程(shell),该子进程本身是否为shell.
请注意,全大写变量名称只应用于环境变量.
无论哪种方式,一个子进程永远只继承了副本的变量,其修饰(根据孩子)并不会影响父.
-a
shell选项(使用set -a
或作为命令行选项传递给shell本身)可用于自动导出所有shell变量.从而,
TSAN_OPTIONS="suppressions=/somewhere/file"
- 只是shell变量,但不是环境变量,TSAN_OPTIONS="suppressions=/somewhere/file" ./myprogram
- 在这种情况下它们只是环境变量,仅对THAT COMMAND有效.
在以下情况下,Shell变量也会成为环境变量:
$HOME
export varName[=value]
or,in bash
,with with 显式创建的shell变量declare -x varName[=value]
bash
使用,declare
不使用-x
或local
在函数中使用,只会创建shell变量-a
shell选项生效时隐式创建的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
:
export -n MYVAR
- 这会MYVAR
从环境中删除,但会将其当前值保留为shell变量.declare -p MYVAR
打印变量$MYVAR
的当前值及其属性; 如果输出开头declare -x
,$MYVAR
则导出(是环境变量)