当没有来自标准输入的输入时,避免“读取”命令停止输入

当没有来自标准输入的输入时,避免“读取”命令停止输入

我有一个从命令行获取输入的函数,并且,可选地,来自标准输入。但是,当没有指定输入流时,它将停止输入。

#!/bin/bash
somefunc() {
  # output strings on command line.
  while (($#)); do
    echo "$1"
    shift
  done

  # take input from stdin, if it exists.
  declare line
  while read -sr line; do 
    echo "$line"
  done
}

somefunc "$@"

这有效:

$ somefunc "arg1" "arg2" "..." <"/some/file"

这不会:

$ somefunc "arg1" "arg2" "..." 

我可以通过在读取命令上使用超时(例如 -t 0.0001)来解决这个问题,但这似乎有点笨拙和脆弱。

有没有更好的方法在不使用超时的情况下实现这一目标?

答案1

使用 -t 的 bash 内置测试应该能够很好地完成这项工作。 [ -t 0 ] 这个链接中有一个很好的例子:

如何检测输入是否来自参数、文件或终端

答案2

有两种解决方案,并且都同样快速且不笨拙。

这是我的首选解决方案:

  # take input from stdin, if it exists.
  if read -t 0; then
    declare line
    while read -sr line; do 
      echo "$line"
    done
  fi

[ -t 0 ] 也有效:

  # take input from stdin, if it exists.
  if [ -t 0 ]; then
    declare line
    while read -sr line; do 
      echo "$line"
    done
  fi

答案3

也许如果你< /dev/null在挂起的命令末尾添加。

这将提供命令虚拟输入,以便它可以继续前进,而不会试图干扰您的标准输入。

相关内容