如何制作“enscript”块直到打印机完成其工作?

如何制作“enscript”块直到打印机完成其工作?

以下命令将在以下位置创建一个 pdf 文件~/PDF/

enscript -B -P PDF  bloom.c

我想将输出的 pdf 文件移至此处

mv "`ls -dtr1 ~/PDF/* | tail -1`" .

但我无法mv按照命令立即运行该命令enscript,因为enscript将输入文件发送到打印机PDF,并在打印机完成创建pdf文件之前立即返回。

一个非常糟糕的解决方案是在两个命令之间插入以下命令

sleep 5

这很糟糕,因为我不知道我还要等多久。

请注意,我知道还有其他更好的方法可以做同样的事情,而不必mv在之后运行命令enscript,但我只是想知道是否有任何方法可以阻止enscript打印机完成其工作?我记得除了 之外,其他命令也有类似的想法enscript。我假设enscript没有提供这样的选项,所以对 bash 或其他程序是否可以实现这一点感兴趣。信号处理可能是一个解决方案,但我不知道要捕获哪个信号。

答案1

由于这太大了,无法放入注释,您是否尝试检查~/PDF目录中的任何文件是否仍然打开当它们开始缠绕时通过使用lsof(列出打开文件)?

在您的之后添加此代码片段enscript -B -P PDF bloom.c

# Go into endless loop and break when all files in */PDF/* are closed.
while :
do
    if ! [[ `lsof | grep /PDF/` ]]
    then
        break
    fi
    sleep 1
done

和之前

mv "`ls -dtr1 ~/PDF/* | tail -1`"

这样你就只损失了1秒......

欲了解更多信息:

  • lsof将列出所有当前打开的文件
  • 义务man lsof将为您提供更多详细信息。

;-)

相关内容