我知道这个问题已经被问过好几次了,但对我来说似乎无效。
[[ ! -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 _
请注意,如果您正在从管道中读取并且没有写入器存在,则此操作仍将挂起(在 上)。如果有作家在场,它就会像我所描述的那样工作,即使该作家没有写任何东西可供阅读。