Shell 如何读取zsh的管道?

Shell 如何读取zsh的管道?,shell,pipe,zsh,Shell,Pipe,Zsh,使用bash一切正常: $ yes | bash -c 'read -sn 1 -p "[Y/n] " RESPONSE ; echo $RESPONSE' y 但是有了zsh我就有麻烦了: $ yes | zsh -c 'read -sk 1 "RESPONSE?[Y/n] " ; echo $RESPONSE' [Y/n] 当使用-k选项时,除非另有指示,否则zsh的读取命令将从终端读取。这在zshbuiltins手册页的相应部分中有记录。管道正在为脚本提供标准输入,但这对从终端读取的尝

使用bash一切正常:

$ yes | bash -c 'read -sn 1 -p "[Y/n] " RESPONSE ; echo $RESPONSE'
y
但是有了zsh我就有麻烦了:

$ yes | zsh -c 'read -sk 1 "RESPONSE?[Y/n] " ; echo $RESPONSE'
[Y/n]

当使用
-k
选项时,除非另有指示,否则zsh的
读取
命令将从终端读取。这在
zshbuiltins
手册页的相应部分中有记录。管道正在为脚本提供标准输入,但这对从终端读取的尝试没有影响


您可以将
-u0
添加到调用
read
中,告诉它从标准输入(文件描述符0)读取,即使其他选项(如
-k
)会导致它从其他地方读取。

这与问题无关;但是如果你在外层使用单引号,你可以消除所有难看的反斜杠(在两个版本中)。那么有没有一种方法可以做到这一点<代码>是| zsh-c'如果[-t0]];然后读取-sk 1“响应?[Y/n]”;否则读取-u 0-sk 1“响应?[Y/n]”;fi;echo$RESPONSE'在任何一种情况下,您都应该能够使用
-u 0
。如果我正确地读取了该代码(注释中的代码很难读取),它将检查文件描述符0是否是一个终端,它是否符合从终端读取的默认值
read
,否则它将指定从文件描述符0读取。如果测试通过,那么指定文件描述符应该没有什么坏处;在这两种情况下,它都将从终端读取。默认情况下,它应该从终端读取,但在通过管道传输时,它可以理解来自stdin的输入。