我正在制作一个快速脚本,应该使用剪贴板中图像上的OCR工具(tesseract
)将其转换为文本并输出。看起来是这样的:
#!/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.
有人知道为什么会这样吗?
提前谢谢。
发布于 2022-04-04 10:10:17
进程替换是一种ksh特性(在zsh和bash中也是可用的),而不是使用管道(在支持/dev/fd/n
的系统上未命名,而不是临时文件)。
在这里,tesseract
可能需要能够在文件中查找或者预先知道它的大小,这在管道中是不可能的。它还可以期望文件名具有特定的扩展名。
对于使用临时文件的进程替换,您需要只在=(...)
外壳中可用的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<<< ''
由于遗传和字符串(以前在bash中)被实现为已删除的临时文件,并且在Linux和Cygwin上,打开/dev/fd/n
(其中n是在文件上打开的文件描述符)将打开该文件,而不是像在大多数(如果不是所有其他系统)上那样重复fd。
https://unix.stackexchange.com/questions/697958
复制相似问题