一个有输入和输出的示例
Bpipe 如何处理输入和输出
流程的意义在于使用您拥有的一些数据,对其进行一些操作,然后产生一些输出。此示例将展示如何添加输入和输出文件。
细节
为了演示输入和输出的工作原理,我们需要一个文件作为管道的输入。在这个例子中,创建一个名为“test.txt”的文件,其中只包含“Bpipe”这个词,或者任何你喜欢的词。例如,在终端执行:
echo Bpipe > test.txt
现在我们有了输入文件,我们可以修改脚本来使用该输入文件。从快速开始示例中编辑您的脚本并将其更改为如下所示的代码:
hello = {
exec "echo Hello | cat - $input > $output"
}
world = {
exec "echo World | cat $input - > $output"
}
run { hello + world }
要运行此示例,您需要提供输入文件作为参数,如下所示:
bpipe run helloworld.pipe test.txt
解释说明
在这个例子中,你可以看到我们的命令看起来很像你在终端执行的普通shell
命令,但是添加了两个很像shell的变量:$input
和$output
。这些变量在每个阶段运行之前,由Bpipe为您隐式定义。它们会自动告诉您输入来自哪里以及输出应该去哪里。当然,你也可以将文件名硬编码到您的脚本中,但是您的流程也会使用这些硬编码的文件名,以致于换了一个输入文件,流程就无法使用。同时由于您没有指定输出文件,您可能想知道实际输出文件去哪里了。Bpipe从输入文件作为基础开始,根据输入文件“经过”的不同阶段名称来创建输入输出文件名。在这种情况下,Bpipe 将按如下方式命名您的输出:
test.txt.hello.world
Bpipe从输入文件开始,然后为处理的每个阶段添加“hello”和“world”来创建文件。您可能会发现在文件名中间看到“.txt”有点奇怪:别担心,这种命名方式只是Bpipe不知道您正在创建的文件类型时的默认行为。本教程的后续步骤将向您展示如何更改此设置。
隐式指定文件类型
Bpipe 提供了一种快速简单的方法来指定输入和输出文件的文件类型:将文件类型的扩展名添加到 $input 和 $output 变量后面。例如,您可以告诉Bpipe上述流程中的文件是文本文件,如下所示:
hello = {
exec "echo Hello | cat - $input.txt > $output.txt"
}
world = {
exec "echo World | cat $input.txt - > $output.txt"
}
run { hello + world }
这个流程的工作方式与前一个类似,但有两个优点: Bpipe 现在检查输入文件是否为文本文件;如果您尝试在具有其他扩展名的文件上运行它,则会出现错误。此外,Bpipe现在知道输出文件应该以“.txt”结尾,因为您的输出$output.txt
有后缀。所以现在我们的输出文件是这样的:
test.txt
test.hello.txt
test.hello.world.txt
通过了解 Bpipe文件命名习惯,您现在可以通过查看文件名轻松了解任何文件发生了哪些操作:
- test.txt 是输入文件
- test.hello.txt 是test.txt传递到“hello”阶段创建的
- test.hello.world.txt是test.hello.txt通过“world”管道阶段创建的
这个约定是Bpipe确保您永远不会对任何文件的创建感到困惑的原因之一。
注意:有一个额外的好处,这个小改动也足以让Bpipe执行依赖性检查;也就是说,如果输出文件比输入文件新,Bpipe将不会重新创建它们,即使运行相关阶段。
注释阶段类型
虽然上面的流程可以运行,但我们可以通过给Bpipe一些关于每个阶段正在做什么的小提示来使它更好。为此,我们可以向阶段添加一些注释,如下所示:
@Filter("hello")
hello = {
exec "echo Hello | cat - $input > $output"
}
@Filter("world")
world = {
exec "echo World | cat $input - > $output"
}
在这里,我们用@Filter
来对每个阶段进行注释,标识了过滤类型的名称(“hello”和“world”)。我们称之为过滤,因为它涉及修改文件而不改变其类型。由于输入文件是一个文本文件而输出也是一个文本文件,这使得我们的示例成为一个过滤操作。另一方面,更改格式或将其转换为不同格式的操作在 Bpipe 中称为转换操作。因此,如果我们将文件更改为另一种格式(例如,CSV 或 XML),我们将使用 @Transform 对其进行注释。
向脚本添加过滤注释的结果,与向$input
和$output
变量添加文件扩展名非常相似。但是,通过使用@Filter
或@Transform
对一个阶段进行申明,可以更清楚地表达您的意图。然而,选择权在你手中。