Processes
在Nextflow中,process 是執(zhí)行用戶腳本的基本處理primitive。
進程定義以關(guān)鍵字 process開始,接著是進程名,最后是用花括號分隔的進程體。進程主體必須包含一個表示命令的字符串,或者,包含由它執(zhí)行的腳本?;玖鞒倘缦吕?
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塊是一個字符串語句,它定義了進程執(zhí)行任務時所執(zhí)行的命令。
一個進程包含且僅包含一個script塊,當進程包含輸入和輸出聲明時,它必須是最后一條語句。
輸入的字符串在host系統(tǒng)中作為Bash腳本執(zhí)行。它可以是您通常在終端shell或公共Bash腳本中使用的任何命令、腳本或它們的組合。
script語句中可以使用的命令的唯一限制是目標執(zhí)行系統(tǒng)中這些程序的可用性。
腳本塊可以是一個簡單的字符串或多行字符串。后者簡化了由跨多行多個命令組成的非簡單腳本的編寫。例如:
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教程部分所解釋的,字符串可以通過使用單引號或雙引號定義,多行字符串可以由三個單引號或三個雙引號字符定義。
他們之間有一個微妙但重要的區(qū)別。與Bash類似,以"分隔的字符串支持變量替換,而以'分隔的字符串則不支持變量替換。
在上面的代碼片段中,$db變量被管道腳本中某處定義的實際值所替換。
!Warning
由于Nextflow對字符串中的變量替換使用相同的Bash語法,因此需要仔細管理它們,這取決于您是想在Nextflow上下文中計算變量,還是在Bash環(huán)境執(zhí)行中計算變量。
當需要訪問腳本中的系統(tǒng)環(huán)境變量時,有兩個選項。第一種選擇與使用單引號字符串定義腳本塊一樣簡單。例如
process printPath {
'''
echo The path is: $PATH
'''
}
這種解決方案的缺點是,您將無法在腳本塊中訪問管道腳本上下文中定義的變量。
要解決這個問題,請使用雙引號字符串定義腳本,并在系統(tǒng)環(huán)境變量前加上反斜杠\字符進行轉(zhuǎn)義,如下面的示例所示:
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在執(zhí)行腳本之前用實際值替換它。相反,$DB變量必須存在于腳本執(zhí)行環(huán)境中,Bash解釋器將用實際值替換它。