在脚本中,检查标准输入是否来自文件或管道

在脚本中,检查标准输入是否来自文件或管道

我知道这已经是不好之前已介绍过,但这些答案要么缺乏解释,要么不适用。

基本上在某些时候我的脚本需要检查是否指定了文件,如果是,稍后将用作输入。

[ -f "$1" ] && TINPUT="$1"

足够简单...现在,如果未找到或未指定文件,我将TINPUT="-"告诉后面的命令读取标准输入。

这是我的问题...如果脚本在没有管道或没有指定文件的情况下运行,我如何让脚本因错误而终止?

我使用的是 dash,Debian POSIX 兼容的 shell,所以我不能使用 Bashisms。我也更喜欢使用列表,ifs但大多数ifs都可以用列表编写。

答案1

您可以测试标准输入是否是终端:

if [ -n "$1" ]; then
  exec <"$1"
elif tty >/dev/null; then
  echo 1>&2 'Cowardly refusing to read data from a terminal.'
  exit 2
# else we're reading from a file or pipe
fi

相关内容