Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本:将慢速命令的输出重定向到文件_Bash_Output_Buffer - Fatal编程技术网

Bash脚本:将慢速命令的输出重定向到文件

Bash脚本:将慢速命令的输出重定向到文件,bash,output,buffer,Bash,Output,Buffer,我正在根据udev规则运行下面的脚本,这样当我启动打印机时,它会查找墨盒中剩余的墨水,并发送一封包含这些信息的电子邮件。总的来说,它工作得很好,除了escputil命令输出数据非常慢。因此,我的中间“out”文件是空的,通知电子邮件也是空的 我尝试了stdbuf来修复它,标准重定向或tee,都没有帮助。 有什么想法吗?提前感谢, #!/bin/sh mkdir /var/lock/epson || exit 1 now=`date +%s` limit=$((now - 1800)) if

我正在根据udev规则运行下面的脚本,这样当我启动打印机时,它会查找墨盒中剩余的墨水,并发送一封包含这些信息的电子邮件。总的来说,它工作得很好,除了escputil命令输出数据非常慢。因此,我的中间“out”文件是空的,通知电子邮件也是空的

我尝试了stdbuf来修复它,标准重定向或tee,都没有帮助。 有什么想法吗?提前感谢,

#!/bin/sh

mkdir /var/lock/epson || exit 1
now=`date +%s`
limit=$((now - 1800))

if [ -f /tmp/epson.ink ] && [ `cat /tmp/epson.ink` -ge $limit ]; then
    rmdir /var/lock/epson && exit 0
fi
sleep 6

stdbuf -oL -eL escputil --quiet --ink-level --raw-device /dev/usb/lp0 2>/dev/null | tee /tmp/epson.out
cat /tmp/epson.out | tail -5 | mail -s "Epson printer ink level" email@example.com
echo "$now" > /tmp/epson.ink

rmdir /var/lock/epson
exit 0
手册页
escputil(1)
中的BUGS部分提到打印机启动时可能不会立即返回结果

我建议在每次尝试后重复该命令并检查输出。在本例中,我假设脚本启动时
/tmp/epson.out
不存在或为空(否则在开始处添加
rm-rf
):

#只要文件不存在或为空:
虽然[-e/tmp/epson.out][$(wc-m/dev/null | tee/tmp/epson.out
睡眠5
完成

我不能在这里测试它,但我不认为stdbuf对您有用。

因此
escputil
在写入
out
文件之前终止?命令运行速度应该不会太慢。如果它写入
stdout
,管道将捕获它并在命令返回之前将其写入文件。您确定
escputil
没有改为写入
stderr
或其他什么吗?没有,因为如果我在shell上运行此命令,就会得到输出。如果打印到stderr,重定向到/dev/null,我将看不到任何输出。i、 e.通过重定向和T形三通?其工作符合预期;我在控制台和文件中都有输出。这确实有效,多个escputil符文,我收到了预期的电子邮件:)谢谢提示!
# as long as the file does not exist or is empty:
while ! [ -e /tmp/epson.out ] || [ $( wc -m < /tmp/epson.out ) -le 0 ]
do 
  escputil --quiet --ink-level --raw-device /dev/usb/lp0 2>/dev/null | tee /tmp/epson.out
  sleep 5
done