【问题标题】:How pipe to zsh read?如何通过管道读取 zsh?
【发布时间】:2015-09-29 22:30:40
【问题描述】:

使用 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]

【问题讨论】:

  • 这与问题无关;但是如果你在外层使用单引号,你可以消除所有丑陋的反斜杠(在两个版本中)。

标签: shell pipe zsh


【解决方案1】:

当使用-k 选项时,zsh 的read 命令将从终端读取,除非另有说明。这记录在zshbuiltins 联机帮助页的相应部分中。您的管道正在为脚本提供标准输入,但这对从终端读取的尝试没有影响。

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

【讨论】:

  • 那么只有一种方法可以做到这一点吗? yes | zsh -c 'if [[ -t 0 ]] ; then read -sk 1 "RESPONSE?[Y/n] " ; else read -u 0 -sk 1 "RESPONSE?[Y/n] " ; fi ; echo $RESPONSE'
  • 无论哪种情况,您都应该可以只使用-u 0。如果我正确读取了该代码(在 cmets 中难以读取代码),它将检查文件描述符 0 是否为终端,如果它与 read 的默认值一起从终端读取,否则它指定从文件描述符读取0. 如果测试通过,指定文件描述符应该没有什么坏处;无论哪种情况,它都会从终端读取。
  • 它应该默认从终端读取,但在管道时理解来自标准输入的输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2020-04-21
  • 1970-01-01
  • 2013-01-29
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多