如何在 bash 中获取标准输出?
How to source stdout in bash?
我在从 stdout 导出环境变量时遇到问题。
我做错了什么以及如何解决?
$ 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
%
更新:
Python3.9 在 macOS 上得到了那个坏掉的管道,所以我正在尝试使用 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$
使用进程替换:
$ . <(python env.py)
$ echo $TEST_ME
123
它的工作方式是:它在文件系统中创建一个临时管道,并将 python env.py
的标准输出连接到该管道。然后 <(...)
构造本身被该管道的文件名替换。
我在从 stdout 导出环境变量时遇到问题。
我做错了什么以及如何解决?
$ 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
%
更新:
Python3.9 在 macOS 上得到了那个坏掉的管道,所以我正在尝试使用 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$
使用进程替换:
$ . <(python env.py)
$ echo $TEST_ME
123
它的工作方式是:它在文件系统中创建一个临时管道,并将 python env.py
的标准输出连接到该管道。然后 <(...)
构造本身被该管道的文件名替换。