gpt4 book ai didi

bash - 如果命令失败,回显后退出_总是_退出

转载 作者:行者123 更新时间:2023-12-05 03:30:19 24 4
gpt4 key购买 nike

我有一个 bash 脚本设置,我在其中 eval 一个名为 snake 的变量,如果出现错误则退出。即使执行 snake 命令没有错误,下面的 aws s3 命令也不会执行。

如果我删除了|| echo "发生错误,看上面。正在退出";退出 1,然后将执行 aws 命令。

我知道 eval $snake 没有错误,因为 echo "ERROR OCCURED, LOOK ABOVE. EXITING" 没有返回到标准输出(它只是实际上有错误的时候)。

我需要在成功运行 eval $snake 后执行 aws 命令,但我不确定如何执行此操作。

s3='ebio/'

# do not edit contents below unless needed

snake="snakemake --default-remote-provider S3 --default-remote-prefix '$s3' --use-conda --cores 32 --rerun-incomplete --printshellcmds"

read -p "Rewrite over samples.tsv, peak_norm.tsv, and treated_vs_untreated.tsv files? (y/n)" -n 1 -r

if [[ $REPLY =~ ^[Yy]$ ]]
then

# exit if snake fails

eval $snake || echo "ERROR OCCURED, LOOK ABOVE. EXITING" ; exit 1

# remove temp files

aws s3 rm --recursive s3://"$s3"rep_element_pipeline --exclude "*" --include "*tmp"
aws s3 rm --recursive s3://"$s3"rep_element_pipeline --exclude "*" --include "*sam.parsed"
aws s3 rm --recursive s3://"$s3"rep_element_pipeline --exclude "*" --include "*sam.parsed.done"
aws s3 rm --recursive s3://"$s3"rep_element_pipeline --exclude "*" --include "*.sam.tmp.combined_w_uniquemap.rmDup.sam"
aws s3 rm --recursive s3://"$s3"rep_element_pipeline --exclude "*" --include "*.sam.tmp.combined_w_uniquemap.prermDup.sam"
aws s3 rm --recursive s3://"$s3"rep_element_pipeline --exclude "*" --include "*.adapterTrim.round2.rmRep.bam.tmp"
aws s3 rm --recursive s3://"$s3"rep_element_pipeline --exclude "*" --include "*.fastq.gz.mapped_vs_bt2_hg38.sam"
aws s3 rm --recursive s3://"$s3"data_analysis --exclude "*" --include "*.saturations_reads.txt"

fi

最佳答案

这里的直接问题是 foo ||酒吧; baz,无论 foo 的退出状态是什么,baz 都会发生。在这方面,作为命令分隔符的分号的处理方式与换行符相同。这可以通过显式分组来解决,例如 foo || { 酒吧;巴兹; }——或者更明确地说,if foo;然后吧;巴兹; fi

相关代码最好写成:

# multi-line form optional, but lets you add comments after each line
snake=(
snakemake
--default-remote-provider S3
--default-remote-prefix '$s3' # FIXME: Sure you don't want "$s3" instead?
--use-conda
--cores 32
--rerun-incomplete
--printshellcmds
)
"${snake[@]}" || { echo "ERROR OCCURRED, LOOK ABOVE, EXITING" >&2; exit 1; }

将命令存储在数组或函数中而不是字符串中可以避免 eval 及其带来的安全问题; BashFAQ #50 中教授了这两种技术,eval 的问题在 BashFAQ #48 中有详细介绍。 .

使用花括号将 exit 1 放在与 echo 相同的组中,确保它们一起发生或根本不发生。

请注意,仅当您希望将确切的字符串 $s3 作为默认远程前缀传递时,'$s3' 才是正确的;如果您希望 名为 s3 的变量的内容 用于此目的,请将其更改为 "$s3"

关于bash - 如果命令失败,回显后退出_总是_退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70851614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com