Shell 无阻塞读取可选标准输入

Shell 无阻塞读取可选标准输入,shell,unix,cat,Shell,Unix,Cat,所以我有一个函数,可以通过标准输入选择提供额外的数据,我用cat抓取它,但是,当没有标准输入时cat将阻止执行 下面是一个愚蠢的例子: foo() { echo "$@" "$(cat)"; } 基本上,它通过参数和标准输入响应作为输入提供的所有内容 在这种情况下,是否有办法防止cat阻塞?目前,如果设置了选项,我只能通过调用cat来解决这个问题,但似乎我真正需要的是cat在没有可读内容的情况下不返回任何内容。它不知道/不知道没有可读内容,而不是什么都没有(链接速度慢,人类还没有开始打字,等等

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

下面是一个愚蠢的例子:

foo() { echo "$@" "$(cat)"; }
基本上,它通过参数和标准输入响应作为输入提供的所有内容


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

它不知道/不知道没有可读内容,而不是什么都没有(链接速度慢,人类还没有开始打字,等等)您可以尝试使用带超时的
read
来获取第一个字符/行,然后仅在成功的情况下使用
cat
,但这将在较慢的输入速度下进行。好吧,但我只对通过管道传输到
foo
的内容感兴趣,而不是任意的标准输入(应该说),也就是说,简单地调用
foo
是不正确的,它应该被称为
foo“bar”
echo“bar”| foo
,是否有某种方法可以区分这一点,例如,我可以检查标准输入是否是全局的(与我的脚本得到的输入相同)?您可以使用
test test
/
[
-t
标志。
foo() {
  if [ -t 0 ]
  then
    echo "$@"
  else
    echo "$@" "$(cat)"
  fi
}