我正在制作一个快速脚本,它应该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.
有人知道为什么会这样吗?
提前致谢。
进程替换,顺便说一下,一个 ksh 功能(在 zsh 和 bash 中也可用),而不是使用管道的 sh (在支持的系统上未命名
/dev/fd/n
,以其他方式命名),而不是临时文件。在这里,
tesseract
可能需要能够在文件中查找或提前知道其大小,这对于管道是不可能的。它还可以期望文件名具有某些扩展名。对于使用临时文件的进程替换,您需要
=(...)
仅在zsh
shell 中可用的表单。您可以设置
$TMPPREFIX
(默认为/tmp/zsh
)和/或$TMPSUFFIX
(默认为空)来控制由创建的临时文件的=(...)
命名方式。例如。
在 5.0 之前的 zsh 和 bash 版本中,以及在 Linux 或 Cygwin 上,您还可以执行以下操作:
由于 heredocs 和 herestrings 被实现(曾经在 bash 中)作为已删除的临时文件,并且在 Linux 和 Cygwin 上,打开
/dev/fd/n
其中 n 是在文件上打开的文件描述符会打开该文件,而不是像在大多数情况下(如果不是全部)那样复制 fd其他系统。