You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:04:52