Bash - 检查标准输入是否包含任何内容

Bash - 检查标准输入是否包含任何内容

我知道这个问题已经被问过好几次了,但对我来说似乎无效。

[[ ! -t 0 ]]= 标准输入包含什么内容吗?

这个命令:

echo 'Hello world' | [[ ! -t 0 ]]
echo $?

给出正确的输出:0,即标准输入包含任何内容。
这个命令:

[[ ! -t 0 ]]
echo $?

给出正确的输出:1,即标准输入为空。
相反,这个命令:

: | [[ ! -t 0 ]]
echo $?

给出意外的输出:0,而标准输入为空:1

为什么会这样?我该如何解决这个问题?

答案1

[[ ! -t 0 ]]= 标准输入包含什么内容吗?

你的前提是错误的。这个测试是否标准输入是否连接到终端/tty,而不是标准输入包含任何东西。由于否定,如果满足以下条件,命令将返回 0(真):标准输入未连接到终端。

man test

-t FD文件描述符FD在终端上打开

man bash

-t fd如果文件描述符fd已打开并且引用终端,则为 True。

考虑到这一点,重新评估您的示例,您会发现它们确实返回了预期的退出状态。

检查是否有待处理事项的正确方法标准输入将使用select(2),但这不能直接在 shell 中使用,例如bash.我可以建议的最接近的是read立即超时使用:

sleep 2
if read -t 0 _
then
    echo "Ready to receive data"
    IFS= read -r data
    echo "Received: $data"
fi

运行它,然后在初始期间sleep,(a) 尝试预加载标准输入对于某些文本,(b) 不执行任何操作。

read -t 0 _请注意,如果您正在从管道中读取并且没有写入器存在,则此操作仍将挂起(在 上)。如果有作家在场,它就会像我所描述的那样工作,即使该作家没有写任何东西可供阅读。

相关内容