【问题标题】:Reading Optional Standard Input Without Blocking读取可选标准输入而不阻塞
【发布时间】:2015-07-08 13:31:31
【问题描述】:

所以我有一个函数可以选择通过标准输入提供额外的数据,我用cat 抓取它,但是,当没有标准输入时cat 将阻止执行。

这是一个愚蠢的例子:

foo() { echo "$@" "$(cat)"; }

基本上,它通过参数和标准输入来回显作为输入给出的所有内容。

有没有办法防止cat 在这种情况下被阻塞?目前,如果设置了这样做的选项,我只能通过调用cat 来解决这个问题,但似乎我真正需要的只是让cat 在没有什么可读的情况下不返回任何内容。

【问题讨论】:

  • 它不知道/不知道没有什么可读的与什么都没有还没有(链接慢,人类还没有开始打字等)你可以尝试使用 read 超时来获取第一个字符/行,然后仅在成功的情况下使用 cat ,但这会因输入缓慢而竞争。
  • 好的,但我只对通过管道传输到 foo 的内容感兴趣,而不是任意标准输入(应该说),即简单地调用 foo 是不正确的,它应该要么被称为foo "bar"echo "bar" | foo,有什么方法可以区分,例如,我可以检查标准输入是否是全局的(与我的脚本得到的相同)?
  • 您可以使用 test/[ -t 标志测试标准输入是否为终端。

标签: shell unix cat


【解决方案1】:
foo() {
  if [ -t 0 ]
  then
    echo "$@"
  else
    echo "$@" "$(cat)"
  fi
}

【讨论】:

    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多