BASH - 检查未命名管道是否为空

BASH - 检查未命名管道是否为空

我的问题是,我想要一个从管道读取内容的脚本,检查它是否为空,如果不是,则输出它,如下所示:

#!/bin/bash
var=$(cat -)
if [ -n "$var" ]
then
    echo "$var"
else
    echo "Pipe was empty"
fi

问题是,如果管道为空,cat 会从 stdin 读取数据。有什么方法可以阻止 cat 这样做吗?或者 cat 不是这里合适的工具?

答案1

用于read -t 0 -N 0检测 stdin 上是否有数据。使用test -t 0tty尝试检测管道是否已连接到 stdin。

答案2

test -t 0,对我而言没有用,而且人们这里说它是“非确定性的”或其他什么的。我喜欢wc -c(计数字节)的解决方案,简单又好用。空输入有 1 个字节,而单个字符例如echo "a" | wc -c给出 2

| (read line; if [ $(echo "$line" | wc -c) -gt 1 ]; then echo "$line"; fi) |

由于read; if ...“参见”周围的括号,此输出仍可通过管道传输此问答

相关内容