将两个命令组合成一个命令

将两个命令组合成一个命令

我正在寻找一种将这两者结合起来的方法,以便我可以从命令行一步完成。 (我认为%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

构建一个简单的 bash 脚本可能是最佳选择。以下是一些不错的入门示例。

TLDP.org Linux.com

请特别查看 Linux.com 变量部分。您甚至不需要构建函数,只需将命令与变量链接起来,这样您就可以使脚本更具可扩展性和可重用性。

答案4

我建议另一种解决方案。

convert Tess.jpg tif:- | tesseract stdin tess

这样就避免了创建任何中间文件 tess.tif。相反,它将输出直接通过管道传输converttesseract

这样做有一些优点:

  1. 不要用中间文件污染目录,
  2. 你不会对硬盘进行不必要的写入,
  3. 可能会稍微快一些。

许多命令行工具能够从 stdin 输出到 stdout/input,而不是使用文件。对于这些convert,我在各自的页面tesseract中找到了如何做到这一点。man

它可以按照其他人提到的那样变成命令:

  1. 创建 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
  1. 创建 Bash 函数
echo 'text2file() {' >> ~/.bashrc
echo 'convert "$1.jpg" tif:- | tesseract stdin "$1"' >> ~/.bashrc
echo '}' >> ~/.bashrc

它不会立即可用。您需要使用source ~/.bashrc或打开新终端来重新加载 .bashrc 配置。

相关内容