Есть скрипт, который берёт файл с изображением, преобразует его с разными наборами параметров (для простоты — гаммы) и сохраняет ещё 7 вариантов. Затем полученный набор изображения распознаются Tesseract-ом.
Хочется сделать то же самое с буфером обмена без сохранения промежуточных файлов. Желательно иметь возможность ограничивать число процессов.
Скрипт варьирования гаммы:
for g in 2 4 8 0.5 0.25 0.125 0.0625
do
sem -j8 --quote convert "$filename" -gamma $g "`basename "$filename" .jpg`"-$g.jpg;
done
Скрипт распознавания содержимого буфера обмена:
xclip -out -selection clipboard -target image/jpeg | { tesseract - - -l rus+eng+ukr+fra+spa; echo ; } | xclip -selection clipboard -in
(Формат JPEG — из-за проблем в Тессеракте.)
Мне нужно направить stdin в несколько процессов, затем последовательно собрать их stdout-ы и направить в буфер. Всюду рекомендуют tee, но он направляет на stdout и исходный бинарный битмап. Пока получилось что-то вроде:
function cr () ( tesseract - - -l rus+eng+ukr+fra+spa; echo ; )
function vg () ( echo $1; convert - -gamma $1 -format jpeg - | cr )
xclip -out -selection clipboard -target image/jpeg | tee \
>( echo 1; cr ) \
>( vg 2 ) \
>( vg 4 ) \
>( vg 8 ) \
>( vg 0.5 ) \
>( vg 0.25 ) \
>( vg 0.125 ) \
>( vg 0.0625 ) \
| xclip -selection clipboard -in
Проблемы следующие:
- Все echo отрабатывают одновременно, не дожидаясь окончания convert и tesseract. Как сделать, чтобы результат подпроцесса шёл на stdout одной порцией по завершению подпроцесса? (Пока ставлю echo в конец, но это не столь удобно.)
- Не всегда удобно запускать 8 процессов одновременно. Иногда нужно ограничить их число 4 или даже 1. Как это сделать?
- Как в tee лучше заблокировать вывод исходного stdin? Или чем заменить tee? — ОТВЕТ:
... | tee >(...) >(...) > /dev/null | ...
- Как это записать покороче? Строки я сократил, вынеся всё в функции, но как разместить под tee цикл?
- Если выполняю скрипт в шелле без последней команды — без редиректа в xclip — получаю ошибки «bash: 62: команда не найдена», «bash: 1: команда не найдена», «bash: 4c: команда не найдена» и непонятно откуда в истории команд шелла появляется
62;1;4c
. Что это? — ОТВЕТ: Побочный эффект от вывода JPEG в консоль.