Shell-Script
Tesseract 不接受程序替換
我正在製作一個快速腳本,它應該
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 中可用的表單。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其他系統。