我正在寻找一种将这两者结合起来的方法,以便我可以从命令行一步完成。 (我认为%1
是在命令中。)
convert Tess.jpg tess.tif
tesseract tess.tif tess
例如:
text2file name of scanned document
这是在 Ubuntu MATE 上。
答案1
您表示希望能够运行
text2file name-of-scanned-document
达到下面两个命令的效果:
convert Tess.jpg tess.tif
tesseract tess.tif tess
在这种情况下,您希望编写一个简单的脚本,或者定义一个 shell 函数。您提到您认为您编写的内容可能包含%1
。这就是 Windows(以及之前的 DOS)批处理文件使用传递给它的第一个命令行参数的方式,但在 Bash 中位置参数而是${1}
、${2}
等1({
}
下面的括号是可选的${10}
)。因此,你应该写$1
,而不是%1
。
要创建 shell 脚本,请创建一个文件,并以您想要的命令名称命名 ( 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"
&&
必须不先于换行,但后面可以跟一个如果你喜欢,或者您可以删除其后的换行符,如下所示Giiba 的回答也就是说,那里展示的技术是完全正确的(尽管它没有在编写脚本的上下文中呈现)。
(&&
实现该目标的两种最流行的方法之一。另一种是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
,因此您不应该(实际上也不应该)tess
在运行它时在其后写上文件类型后缀。以下是当名称two words
包含空格时如何运行它的示例:
text2file 'two words'
如果你愿意将其text2file
作为 shell 函数来实现,那么你可以将此定义放在~/.bashrc
:
text2file() {
convert "$1.jpg" "$1.tiff"
tesseract "$1.tiff" "$1"
}
或者:
text2file() {
convert "$1.jpg" "$1.tiff" &&
tesseract "$1.tiff" "$1"
}
然后,在您随后启动的所有交互式 Bash shell 中,它都将可用。如果您想在已启动的 shell 中使用它,您可以 source ~/.bashrc
( . ~/.bashrc
),或者您可以在 shell 中直接运行该函数定义(即上面显示的代码)。
当使用交互式 Bash shell 时,您可以按照将其编写为脚本并将其放在$PATH
.
1从技术上讲,位置参数是他们自己 1
(非$1
或${1}
),2
(非$2
或${2}
),等等。同样,从技术上讲,您没有$PATH
环境变量,因为环境变量被称为PATH
。与某些语言(例如 Perl、PowerShell)不同,前导$
(以及后续的封闭{
}
,如果存在)实际上不是参数或变量名称的一部分,而是用于触发参数扩展的语法。
答案2
您可以使用 && 来连接终端命令:
<command 1> && <command 2> && <command 3>
因此,如果我理解正确的话,您想要:
convert tess.jpg tess.tif && tesseract tess.tif tess
答案3
答案4
我建议另一种解决方案。
convert Tess.jpg tif:- | tesseract stdin tess
这样就避免了创建任何中间文件 tess.tif。相反,它将输出直接通过管道传输convert
到tesseract
。
这样做有一些优点:
- 不要用中间文件污染目录,
- 你不会对硬盘进行不必要的写入,
- 可能会稍微快一些。
许多命令行工具能够从 stdin 输出到 stdout/input,而不是使用文件。对于这些convert
,我在各自的页面tesseract
中找到了如何做到这一点。man
它可以按照其他人提到的那样变成命令:
- 创建 Shell 脚本:
echo '#!/bin/sh' > text2file
echo 'convert "$1.jpg" tif:- | tesseract stdin "$1"' >> text2file
chmod +x text2file
./text2file tess
这些命令将在当前目录中创建一个脚本,因此只能在当前目录中访问它。要使其在任何目录中都可以访问,您需要将其移动到例如~/.local/bin
使用命令。mv text2file ~/.local/bin
之后它可以在任何目录中使用,例如:
text2file tess
- 创建 Bash 函数
echo 'text2file() {' >> ~/.bashrc
echo 'convert "$1.jpg" tif:- | tesseract stdin "$1"' >> ~/.bashrc
echo '}' >> ~/.bashrc
它不会立即可用。您需要使用source ~/.bashrc
或打开新终端来重新加载 .bashrc 配置。