考虑以下示例,模拟一个在10秒后给出输出的命令:exec 5< <(sleep 10; pwd)
在Solaris中,如果我在10秒之前检查文件描述符,我可以看到它的大小为0,这告诉我它还没有填充数据。我可以简单地检查每一秒,直到满足文件测试条件(不同于0)然后拉数据:
while true; do
if [[ -s /proc/$$/fd/5 ]]; then
variable=$(cat <&5)
break
fi
sleep 1
done
但是在Linux中我不能这样做(RedHat,Debian等)。所有文件描述符的大小均为64字节,无论它们是否保存数据。对于将花费不同时间来转储其输出的各种命令,我不知道何时应该读取文件描述符。不,我不想等待cat <&5
完成,我需要知道何时应该首先执行cat
。因为我使用此机制发出同步命令并将其输出分配给相应的文件描述符。如前所述,这在Solaris中很有用。
答案 0 :(得分:4)
这是一个想法的骨架:
#!/bin/bash
exec 5< <(sleep 4; pwd)
while true
do
if
read -t 0 -u 5 dummy
then
echo Data available
cat <&5
break
else
echo No data
fi
sleep 1
done
来自Bash参考手册:
如果超时为0,则立即返回读取,而不尝试读取和 数据。如果输入在指定文件上可用,则退出状态为0 描述符,否则为非零。
我们的想法是使用带有-t 0
的读取(零超时)和-u 5
(从文件描述符5读取)来立即检查数据可用性。
当然,这只是一个展示这个概念的玩具循环。