根据我的阅读,将命令放在括号中应该在子shell 中运行它,类似于运行脚本。如果这是真的,如果 x 未导出,它如何查看变量 x?
x=1
Run Code Online (Sandbox Code Playgroud)
(echo $x)在命令行上运行结果为 1
echo $x正如预期的那样,在脚本中运行不会产生任何结果
还有在shell变量一样$0,$1,$2,$?,等。
我尝试使用以下命令打印 shell 和环境变量:
set
Run Code Online (Sandbox Code Playgroud)
但是这些变量不在列表中。
所以基本上这些变量不被认为是shell/环境变量,对吧?(即使要输出它们,您也必须在它们前面加上$,就像使用 shell/环境变量一样)
引自维基百科:
默认情况下,创建进程时,它继承其父进程的重复环境,但父进程在创建子进程时所做的显式更改除外。在 API 级别,这些更改必须在 fork 和 exec 之间完成。或者,在 bash 等 shell 中,您可以通过 env 或使用 ENVIRONMENT_VARIABLE=VALUE 符号间接调用特定命令调用来更改环境变量。
我理解“当一个进程被创建时,它继承了其父进程的重复环境”。但我想知道异常“父级在创建子级时所做的显式更改”的真正含义是什么?我不明白 API 和 shell 中的示例如何成为异常示例。
我知道我可以通过在前面添加环境变量来将其传递给命令,如下所示:
env_variable=value command
Run Code Online (Sandbox Code Playgroud)
但今天我不小心&&在变量和命令之间添加了:
env_variable=value && command exactly
^
^
Run Code Online (Sandbox Code Playgroud)
我很好奇它与正确的方法有什么不同。我知道您可以使用&&将命令链接在一起。但有趣的是,该命令没有收到变量,为什么呢?如果有人解释第二个变体与第一个变体到底有何不同以及为什么命令没有看到该变量,我将不胜感激。谢谢
我已经看到了相关的问题,比如这个,但他们没有提供确切的回答我的问题
从我的实验以及这个答案,printenv并env几乎表现出相同的设定的系统变量。
如果我将变量设置在
/etc/bash.bashrc(应该用于系统范围的系统变量)
SYSTEM_ENVI=1000
Run Code Online (Sandbox Code Playgroud)~/.bashrc (应该用于用户特定的系统变量)
USER_ENVI=10
Run Code Online (Sandbox Code Playgroud)我什至注销并登录,以便 /etc/environment 生效。发生以下场景:
$echo $SYSTEM_ENVI
//outputs 1000
$echo $USER_ENVI
//outputs 10
$CURR_ENVI=1
$env | grep USER_ENVI
//nothing shows up, the same if I grepped SYSTEM_ENVI or CURR_ENVI
$set | grep USER_ENVI
//shows up USER_ENVI assignment, the same if I grepped SYSTEM_ENVI or CURR_ENVI
Run Code Online (Sandbox Code Playgroud)
我的问题是:
printenv/env打印?set查看所有可访问的变量(系统变量和局部变量)而不是printenvorenv吗?关于不重复的理由
就我而言,这个问题和明显的答案帮助我意识到以下事实: