Processes
在Nextflow中,process 是执行用户脚本的基本处理primitive。
进程定义以关键字 process
开始,接着是进程名,最后是用花括号分隔的进程体。进程主体必须包含一个表示命令的字符串,或者,包含由它执行的脚本。基本流程如下例所示:
process sayHello {
"""
echo 'Hello world!' > file
"""
}
一个流程可以包含五个定义块,分别是:指令、输入、输出、when从句和流程脚本。语法定义如下:
process < name > {
[ directives ]
input:
< process inputs >
output:
< process outputs >
when:
< condition >
[script|shell|exec]:
< user script to be executed >
}
Script
script块是一个字符串语句,它定义了进程执行任务时所执行的命令。
一个进程包含且仅包含一个script块,当进程包含输入和输出声明时,它必须是最后一条语句。
输入的字符串在host系统中作为Bash脚本执行。它可以是您通常在终端shell或公共Bash脚本中使用的任何命令、脚本或它们的组合。
script语句中可以使用的命令的唯一限制是目标执行系统中这些程序的可用性。
脚本块可以是一个简单的字符串或多行字符串。后者简化了由跨多行多个命令组成的非简单脚本的编写。例如:
process doMoreThings {
"""
blastp -db $db -query query.fa -outfmt 6 > blast_result
cat blast_result | head -n 10 | cut -f 2 > top_hits
blastdbcmd -db $db -entry_batch top_hits > sequences
"""
}
正如 script教程部分所解释的,字符串可以通过使用单引号或双引号定义,多行字符串可以由三个单引号或三个双引号字符定义。
他们之间有一个微妙但重要的区别。与Bash类似,以"分隔的字符串支持变量替换,而以'分隔的字符串则不支持变量替换。
在上面的代码片段中,$db变量被管道脚本中某处定义的实际值所替换。
!Warning
由于Nextflow对字符串中的变量替换使用相同的Bash语法,因此需要仔细管理它们,这取决于您是想在Nextflow上下文中计算变量,还是在Bash环境执行中计算变量。
当需要访问脚本中的系统环境变量时,有两个选项。第一种选择与使用单引号字符串定义脚本块一样简单。例如
process printPath {
'''
echo The path is: $PATH
'''
}
这种解决方案的缺点是,您将无法在脚本块中访问管道脚本上下文中定义的变量。
要解决这个问题,请使用双引号字符串定义脚本,并在系统环境变量前加上反斜杠\
字符进行转义,如下面的示例所示:
process doOtherThings {
"""
blastp -db \$DB -query query.fa -outfmt 6 > blast_result
cat blast_result | head -n $MAX | cut -f 2 > top_hits
blastdbcmd -db \$DB -entry_batch top_hits > sequences
"""
}
在本例中,\$MAX
变量必须在之前的管道脚本中定义。Nextflow在执行脚本之前用实际值替换它。相反,$DB变量必须存在于脚本执行环境中,Bash解释器将用实际值替换它。