当使用命令在同一行中执行“环境变量”时,它们如何工作?

当使用命令在同一行中执行“环境变量”时,它们如何工作?

我可以向 Python 脚本提供环境变量并立即使用以下命令打印它:

$ FOO="bar" python -c "import os; print(os.environ.get('FOO'))"
bar

然而,这同样不适用于echo

$ FOO="bar" echo $FOO
 
$ echo $PWD
/home/nntin

第一个问题: 怎么没打印出来bar


运行多个命令时,环境变量仅应用于第一个命令。

$ FOO="bar" python -c "import os; print(os.environ.get('FOO'))" && python -c "import os; print(os.environ.get('FOO'))"
bar
None

我可以用以下方法解决它:

$ FOO="bar" python -c "import os; print(os.environ.get('FOO'))" && FOO="bar" python -c "import os; print(os.environ.get('FOO'))"
bar
bar

但是当我传递很多环境变量时,它会变得很笨重。

第二个问题: 我怎样才能将它应用到两者上?我想用例如依次执行两个命令,&&但我只想在命令行中定义环境变量一次而不是两次。

我更喜欢在同一命令行中设置环境变量因为环境变量可能会发生变化,对我来说,执行一行命令比顺序执行多个命令更容易。我更愿意只需要更改一个值。

PS:请原谅我的标题令人困惑。我不知道它叫什么,也不知道在哪里可以找到它。当我像这样执行代码时,环境变量不会永久设置,因为下一个命令行中没有该环境变量。但在代码中它的作用就像一个设置的环境变量。请随意更改标题和描述。

答案1

在第一个示例中:

评估命令行,将值“bar”加载到环境变量“FOO”中,并执行Python代码,评估环境变量“FOO”并打印其内容:“bar”

第二个例子:命令行被eavluated,值“bar”被加载到变量“FOO”中,但echo $FOO同时被评估和$FOO尚未加载,所以它回显空字符串。

在您的第三个示例中,&&分隔两个命令并且临时环境变量不会保留。你可以逃脱

FOO='bar' ( python -c "import os; print(os.environ.get('FOO'))" && FOO="bar" python -c "import os; print(os.environ.get('FOO'))" )

相关内容