Shell-Script

Tesseract 不接受程序替換

  • April 4, 2022

我正在製作一個快速腳本,它應該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可能需要能夠在文件中查找或提前知道其大小,這對於管道是不可能的。它還可以期望文件名具有某些副檔名。

對於使用臨時文件的程序替換,您需要=(...)僅在zshshell 中可用的表單。

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其他系統。

引用自:https://unix.stackexchange.com/questions/697958