I ' Я ищу способ объединить эти два, чтобы я мог сделать это за один шаг из командной строки. (Я думаю, что в команде будет % 1
.)
convert Tess.jpg tess.tif
tesseract tess.tif tess
Например:
text2file name of scanned document
Это на Ubuntu MATE.
Вы указали, что хотите иметь возможность запустить
text2file name-of-scanned-document
, чтобы получить эффект от двух команд:
convert Tess.jpg tess.tif
tesseract tess.tif tess
В этом случае вы хотите написать простой скрипт или определить функцию оболочки. Вы упомянули, что думали, что написанное может содержать % 1
. Вот как в пакетном файле Windows (а до этого DOS) использовался первый переданный ему аргумент командной строки, но в Bash позиционные параметры вместо этого $ {1}
, $ {2}
и т. Д. 1 (со скобками {
}
необязательно ниже $ {10}
). Поэтому вы должны написать $ 1
, а не % 1
.
Чтобы создать сценарий оболочки, создайте файл с именем, которое вы хотите использовать для команды ( text2file
), с таким содержанием:
#!/bin/bash
convert "$1.jpg" "$1.tiff"
tesseract "$1.tiff" "$1"
$ 1
расширяется до первого аргумента командной строки, переданного сценарию. Это может содержать пробелы, просто убедитесь, что заключили в кавычки при запуске скрипта. Двойные кавычки вокруг $ 1
в самом скрипте предназначены для предотвращения нежелательного разбиения слов и глобализации (которые являются дополнительными расширениями, которые в противном случае были бы выполняется в результате расширения параметра ).
Если вы хотите, чтобы команда tesseract
выполнялась только в случае успешного выполнения convert
, то вы можете поместить ] &&
после команды convert
:
#!/bin/bash
convert "$1.jpg" "$1.tiff" &&
tesseract "$1.tiff" "$1"
&&
не должно быть перед новой строкой, но за ней может следовать одна , если хотите , или вы можете удалить символ новой строки сразу после него, как показано в ответе Гийбы . То есть техника, показанная там, является полностью правильной (хотя она не представлена в контексте написания сценария).
( &&
один из двух самых популярных способов достижения этого. Другой - set -e
, который в этом случае будет работать нормально, но который может быть поразительно неинтуитивным в некоторых из своих эффектов .)
Затем пометьте свой исполняемый скрипт, выполнив:
chmod +x text2file
Затем вы можете запустить скрипт, используя путь к нему, который содержит хотя бы один /
. Итак, из того же каталога, в котором находится скрипт:
./text2file name-of-scanned-document
Чтобы иметь возможность запускать его как text2file
, и из любого места поместите файл в каталог, указанный в $ PATH
переменная окружения. Я рекомендую ~ / bin
(т. Е. Каталог bin
, расположенный непосредственно в вашем домашнем каталоге). Если этот каталог не существует, вы можете создать его. При всех последующих входах в систему он будет автоматически добавлен в $ PATH
, поскольку ~ / .profile
содержит код, который проверяет, существует ли ~ / bin
, и добавляет его к $ PATH
, если это так.
Тогда вы запустите:
text2file name-of-scanned-document
Для приведенного вами примера это просто:
text2file tess
$ 1
расширяется до тесс
, когда выполняется таким образом, поэтому вы не должны (и фактически не должны) писать суффикс типа файла после tess
при его запуске. Вот пример того, как вы запустите его, когда имя, , два слова
, содержит пробел:
text2file 'two words'
Если вместо вас ' Если вы хотите реализовать text2file
как функцию оболочки, вы можете поместить это определение внизу ~ / .bashrc
:
text2file() {
convert "$1.jpg" "$1.tiff"
tesseract "$1.tiff" "$1"
}
Или:
text2file() {
convert "$1.jpg" "$1.tiff" &&
tesseract "$1.tiff" "$1"
}
Затем во всех ваших последующих запусках Интерактивные оболочки Bash, это будет доступно. Если вы хотите использовать его в уже запущенной оболочке, вы можете получить исходный код ~ / .bashrc
(. ~ / .Bashrc
), или вы можете напрямую запустить определение этой функции (т.е. код, показанный выше) в оболочке.
При использовании интерактивной оболочки Bash вы выполняете ее точно так же, как если бы вы написали ее в виде сценария и поместили в каталог в вашем $ PATH
.
1 Технически позиционные параметры сами по себе являются 1
(не $ 1
или $ {1}
), 2
(не $ 2
или $ {2}
) и так далее. Точно так же технически у вас нет переменной окружения $ PATH
, так как переменная окружения называется PATH
. В отличие от некоторых языков (например, Perl, PowerShell), ведущий $
(и последующее включение {
}
, если имеется) на самом деле не является частью имени параметра или переменной , но вместо этого используется синтаксис, используемый для запуска расширения параметров.
Я бы предложил другое решение.
convert Tess.jpg tif:- | tesseract stdin tess
Это позволяет избежать создания промежуточного файла tess.tif.
Вместо этого он направляет выходные данные из convert
непосредственно в tesseract
.
Это имеет некоторые преимущества:
Многие инструменты командной строки могут выводить в stdout / input из stdin вместо использования файлов. Для тех convert
и tesseract
я нашел, как это сделать на их страницах man
.
echo '#!/bin/sh' > text2file
echo 'convert "$1.jpg" tif:- | tesseract stdin "$1"' >> text2file
chmod +x text2file
./text2file tess
Эти команды создадут сценарий в текущем каталоге, поэтому он будет доступен только в текущем каталоге. Чтобы сделать его доступным в любом каталоге, вам нужно переместить его в ~ / .local / bin
, например.
Впоследствии его можно использовать в любом каталоге, например:
text2file tess
echo 'text2file() {' >> ~/.bashrc
echo 'convert "$1.jpg" tif:- | tesseract stdin "$1"' >> ~/.bashrc
echo '}' >> ~/.bashrc
Она не будет доступна сразу. Вам потребуется перезагрузить конфигурацию .bashrc с помощью source ~ / .bashrc
или просто открыть новый терминал.
Создание простого bash-скрипта, вероятно, будет лучшим вариантом. Вот несколько хороших примеров того, с чего начать.
Обратите особое внимание на разделы переменных Linux.com. Вам даже не нужно создавать функцию, просто объедините команды в переменную, чтобы сделать скрипт более расширяемым и пригодным для повторного использования.
переменные разделы com. Вам даже не нужно создавать функцию, просто объедините команды в переменную, чтобы сделать скрипт более расширяемым и пригодным для повторного использования. переменные разделы com. Вам даже не нужно создавать функцию, просто объедините команды в переменную, чтобы сделать скрипт более расширяемым и пригодным для повторного использования.вы можете использовать && для присоединения к командам терминала:
<command 1> && <command 2> && <command 3>
Итак, если я правильно понял, вы хотите:
convert tess.jpg tess.tif && tesseract tess.tif tess