Snakemake中如何将stdout和stderr捕获至日志文件?
问题分析
你的shell命令存在重定向顺序错误,导致echo {input}的输出被最终的1> {log.stdout}覆盖,无法写入目标{output}文件,同时stdout日志的捕获逻辑不符合预期。
正确实现方式
根据你的需求(将命令的stdout/stderr捕获到日志,同时将echo内容写入输出文件),提供两种可行方案:
方案1:同时将echo内容写入输出文件和stdout日志
使用tee命令复制标准输出流,确保内容同时进入输出文件和stdout日志,stderr单独写入对应日志:
configfile: "config.json" rule all: input: expand("{sample}.txt", sample = config["samples"]) rule rule1: input: lambda wildcards: config["samples"][wildcards.sample] output: "{sample}.txt" log: stdout="{sample}.txt.stdout", stderr="{sample}.txt.stderr" shell: "echo {input} | tee {output} > {log.stdout} 2> {log.stderr}"
方案2:仅将echo内容写入输出文件,捕获可能的stderr到日志
如果不需要将echo内容同步到stdout日志,仅需捕获命令的错误输出,可简化重定向:
configfile: "config.json" rule all: input: expand("{sample}.txt", sample = config["samples"]) rule rule1: input: lambda wildcards: config["samples"][wildcards.sample] output: "{sample}.txt" log: stderr="{sample}.txt.stderr" shell: "echo {input} > {output} 2> {log.stderr}"
补充说明
- 原命令中
echo {input} > {output} 1> {log.stdout}的问题:重定向按从左到右顺序执行,最终stdout被指向log.stdout,导致output文件为空。 echo命令通常不会产生stderr,因此stderr日志在仅使用echo时会是空文件,但如果后续替换为其他可能产生错误输出的命令,该写法可正常捕获。
内容的提问来源于stack exchange,提问作者Homap
相关产品推荐
相关产品推荐

