Tesseractはプロセスの交換を許可しません。

Tesseractはプロセスの交換を許可しません。

tesseractクリップボードの画像にOCRツール(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ファイルの内部を見たり、ファイルサイズを事前に知ることができるはずですが、パイプでは不可能です。ファイル名に特定の拡張子があると予想することもできます。

=(...)一時ファイルを使用してプロセスを置き換えるには、シェルでのみ使用できるフォームが必要です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で)実装されています/dev/fd/n。別のシステムにコピーします。

関連情報