我有一个Bash脚本设置,其中我使用eval变量称为snake,并在出现错误时退出。即使执行snake命令时没有错误,下面的aws s3命令也不会执行。如果我删除|| echo "ERROR OCCURED, LOOK ABOVE. EXITING" ; exit 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
||
左侧的语句返回false时才会执行exit
,那么你需要使用一个组,例如|| { echo "whatever"; exit 1; }
。 - Charles Duffyeval
**。请参见BashFAQ#48和BashFAQ#50。 - Charles Duffyeval
字符串中使用'$s3'
是危险的,考虑一下如果s3=$'$(rm -rf ~)\'$(rm -rf ~)\''
会发生什么(请注意,该字符串中的每个字符都是UNIX文件名中有效的,因此您不能安全地将任意名称的字符串替换为它们)。 - Charles Duffy