Tesseract 不接受进程替换

Tesseract 不接受进程替换

我正在制作一个快速脚本,该脚本应该tesseract在剪贴板中的图像上使用 OCR 工具 ( ) 将其转换为文本并输出。它看起来像这样:

#!/bin/sh

temp="$(mktemp tmpXXX.png)"
xclip -selection clipboard -t image/png -o > $temp
tesseract $temp stdout 2>/dev/null
rm $temp

我想知道为什么这一tesseract <(xclip -selection clipboard -t image/png -o) stdout行不起作用?据我所知,进程替换应该创建tesseract用作输入文件的临时文件(类似于我的完整脚本)。唉,这会导致一个错误:

Error in pixReadStream: Unknown format: no pix returned
Error in pixRead: pix not read
Error during processing.

有人知道为什么会发生这种情况吗?

提前致谢。

答案1

顺便说一句,进程替换是 ksh 的一项功能(在 zsh 和 bash 中也可用),而不是 sh 使用管道(在支持 的系统上未命名/dev/fd/n,否则命名),而不是临时文件。

在这里,tesseract可能需要能够在文件内查找或提前知道其大小,这对于管道来说是不可能的。它还可能期望文件名具有某些扩展名。

对于使用临时文件的进程替换,您需要=(...)仅在 shell 中可用的形式zsh

tesseract =(xclip -selection clipboard -t image/png -o) stdout

您可以设置$TMPPREFIX(默认为/tmp/zsh)和/或$TMPSUFFIX(默认为空)来控制创建的临时文件的=(...)命名方式。

TMPSUFFIX=.png
tesseract =(xclip -selection clipboard -t image/png -o) stdout

例如。

在 5.0 之前的 zsh 和 bash 版本以及 Linux 或 Cygwin 上,您还可以执行以下操作:

{
  xclip -selection clipboard -t image/png -o > /dev/fd/3 &&
    tesseract /dev/fd/3 stdout
} 3<<< ''

由于heredocs和herestrings被实现(过去在bash中)作为已删除的临时文件,并且在Linux和Cygwin上,打开/dev/fd/n其中n是在文件上打开的文件描述符会打开该文件,而不是像在大多数(如果不是全部)上那样复制fd其他系统。

相关内容