为何Zsh中=()语法支持用户输入而<()无法正常工作?
Zsh中<()进程替换配合stdin输入的异常问题
问题描述
要实现一个从stdin读取用户输入、通过source向当前Shell会话导出环境变量的功能,示例Python代码如下:
# myprog.py val = input() print("export FOO='" + val + "'")
在Bash中执行source <(python myprog.py)可以正常工作,但在Zsh中完全失效:使用<()进程替换时,用户输入无法传递给子进程,按下CTRL+C或CTRL+D只会在终端打印^C这类控制字符,无法终止进程,必须通过其他方式结束。
但改用Zsh特有的=()语法却能正常运行:
source =(python myprog.py)
已知Bash和Zsh的<()行为存在差异,Zsh的=()会将子进程输出写入临时文件而非管道,但不清楚为何Zsh结合<()时会出现如此严重的stdin输入问题,未找到相关文档说明。
实际背景
实际场景中使用novops工具,通过source <(novops load)加载环境变量,该命令需要从stdin读取用户输入来选择环境,但在Zsh中遇到上述stdin无法传递的问题。
简单复现示例
可以用基础Shell命令直接复现差异:
# Bash中正常工作,Zsh中失效 cat <(read foo && echo $foo) # Zsh中正常工作 cat =(read foo && echo $foo)
也可以通过容器快速复现Zsh环境下的问题:
docker run -it zshusers/zsh:5.9
内容的提问来源于stack exchange,提问作者Pierre B.
相关产品推荐
相关产品推荐

