如何解决Snakemake 和 bash 脚本管道失败
我正在尝试创建一个对多个错误源具有鲁棒性的蛇形管道。我想在我的管道中调用一个 bash 脚本。提醒用户出现问题的一种标准程序是在 bash 脚本的开头使用以下内容:
#!/bin/bash
set -e
set -u
set -o pipefail
pipefail 在使用管道重定向 std 输出时检查错误。我的脚本中有以下简单的代码行
# Read the first argument
input=$1
less $input | head -10
当我直接在终端中运行我的脚本时使用
bash script.sh input
它运行完全正常,没有检测到任何错误。
然后我希望按照如下规则在蛇形管道中运行此脚本:
shell:
"""
bash script.sh {input}
"""
snakemake 抛出错误:
(one of the commands exited with non-zero exit code; note that snakemake uses bash strict mode!)
如果我然后删除管道故障
# set -o pipefail
然后重新运行snakemake我没有任何问题并且脚本执行得很漂亮。
谁能解释一下看似成功的烟斗与蛇形如何对待它之间的相互作用? (或至少给出诊断提示)。
解决方法
你的脚本:
#!/bin/bash
set -e
set -u
set -o pipefail
input=$1
less $input | head -10
如果输入超过 10 行,则不会真正退出干净。您可以通过以下方式检查:
bash script.sh longfile.txt
echo $? # -> Prints 141
echo $?
返回前一个进程的退出代码,这里是 141,因为 head
破坏了管道(谷歌 退出代码 141 了解更多信息)。
Snakemake 检测到非零退出代码,因此失败,因为 snakemake 在严格模式下执行 shell 脚本(google snakemake 严格 shell 模式)。您想如何处理这个案例取决于您,但这应该是您看到的看似不一致的行为的解释。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。