【问题标题】:How to source stdout in bash?如何在 bash 中获取标准输出?
【发布时间】:2021-12-29 06:44:02
【问题描述】:

我无法从标准输出中导出环境变量。

我做错了什么以及如何解决?

$ cat env.py 
print("export TEST_ME=123")

$ python env.py
export TEST_ME=123

$ echo $(python env.py)
export TEST_ME=123

$ echo $(python env.py) | . /dev/fd/0
bash: echo: write error: Broken pipe

$ echo "export TEST_ME=123" | . /dev/fd/0 && echo $TEST_ME

$

同样的命令在 zsh 中工作

$ zsh
% echo "export TEST_ME=123" | . /dev/fd/0 && echo $TEST_ME
123
%

更新:

macOS 上的 Python3.9 得到了损坏的管道,所以我只尝试使用 echo

$ bash --noprofile --norc
bash-3.2$ . <(echo "export TEST_ME=123") && echo $TEST_ME

bash-3.2$ . <(python3.9 env.py)
bash-3.2$ Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>
BrokenPipeError: [Errno 32] Broken pipe

bash-3.2$ . <(python2 env.py)
bash-3.2$ close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr

bash-3.2$

【问题讨论】:

  • source &lt;(python ./env.py); declare -p TEST_ME
  • 我没有收到该命令的 Broken pipe 错误。无论如何,echo 毫无意义; python env.py | . /dev/fd/0 至少应该一样好,而且逃跑的麻烦更少。
  • source &lt;(echo export TEST_ME=456); declare -p TEST_ME
  • source &lt;(printf 'export TEST_ME=789'); declare -p TEST_ME

标签: python bash macos environment-variables


【解决方案1】:

使用进程替换:

$ . <(python env.py)
$ echo $TEST_ME
123

它的工作方式是:它在文件系统中创建一个临时管道,并将python env.py 的标准输出连接到该管道。然后&lt;(...) 构造本身被该管道的文件名替换。

【讨论】:

  • 我在 macOS 上为我的 python3.9 得到了那个损坏的管道,但它至少可以用于 echo 吗?这不会:`。
  • 用命令及其输出更新问题
  • 在 macOS 中工作:eval "$(echo "export TEST_ME=123")" &amp;&amp; echo $TEST_ME
  • macOS 需要 eval 是不是很奇怪?
  • 我不知道;在其他情况下,进程替换也适用于 macOS。也许它是 bash 3.2 的东西
猜你喜欢
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2019-09-01
相关资源
最近更新 更多