我正在制作一个快速脚本,该脚本应该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其他系统。