gpt4 book ai didi

linux - 如何重新运行 bash 脚本,跳过之前成功运行的行?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:37 26 4
gpt4 key购买 nike

我有一个 bash 脚本,它充当分析管道的包装器。如果脚本出错,我希望能够通过简单地重新运行原始命令从发生错误的地方运行脚本。我设置了两个不同的陷阱;一个将从我的脚本中删除在非零退出时生成的最后一个文件,另一个将在退出信号 = 0 时删除所有临时文件,并在运行结束时基本上清理文件系统。我在 bash 环境中打开了 noclobber,它允许我的脚本跳过已经写入文件的脚本行,但这只会在我不设置非零退出陷阱时这样做。一旦我设置了这个陷阱,它就会在第一行退出,其中 noclobber ID 是一个它不会覆盖的文件。有没有办法让我跳过以前成功运行的代码行,而不必从头开始重新运行我的代码?我知道我可以为每一行使用条件语句,但我认为这样做可能有更简洁的方法。

set -o noclobber

# Function to clean up temporary folders when script exits at the end
rmfile() { rm -r $1 }

# Function to remove the file being currently generated
# Function executed if script errors out

rmlast() {
if [ ! -z "$CURRENTFILE" ]
then
rm -r $1
exit 1
fi }

# Trap to remove the currently generated file
trap 'rmlast "$CURRENTFILE"' ERR SIGINT

#Make temporary directory if it has not been created in a previous run
TEMPDIR=$(find . -name "tmp*")
if [ -z "$TEMPDIR" ]
then
TEMPDIR=$(mktemp -d /test/tmpXXX)
fi

# Set CURRENTFILE variable
CURRENTFILE="${TEMPDIR}/Variants.vcf"

# Set CURRENTFILE variable
complexanalysis_tool input_file > $CURRENTFILE

# Set CURRENTFILE variable
CURRENTFILE="${TEMPDIR}/Filtered.vcf"

complexanalysis_tool2 input_file2 > $CURRENTFILE

CURRENTFILE="${TEMPDIR}/Filtered_2.vcf"

complexanalysis_tool3 input_file3 > $CURRENTFILE

# Move files to final destination folder
mv -nv $TEMPDIR/*.vcf /test/newdest/

# Trap to remove temporary folders when script finishes running
trap 'rmfile "$TEMPDIR"' 0

更新:

有人向我提供建议使用 make 实用程序的答案。我想利用它的内置实用程序来检查依赖项是否已满足。在我手中,VK Kashyap 建议的 makefile 似乎不会跳过先前完成的任务的执行。因此,例如,我运行了上面的脚本,并在它运行 filtered.vcf 时使用 ctrl c 中断了脚本。当我再次重新运行脚本时,它再次从头开始运行,即再次从 varaints.vcf 开始。为了让 makefile 将源显示为已填满,我是否遗漏了什么?

更新答案:

好的,这是一个菜鸟错误,但由于我不熟悉生成 makefile,所以我将发布对我的错误的解释。我的 makefile 没有从退出点重新运行的原因是我将目标命名为与正在生成的输出文件不同的名称。因此,如果您命名目标,例如 VK Kashyap,则可以非常正确地回答。

variants.vcf
filtered.vcf
filtered2.vcf

与正在生成的输出文件相同,然后脚本将跳过之前完成的任务。

最佳答案

make utility 可能是您想要实现的目标的答案。

它有内置的依赖检查(你试图用 tmp 文件实现的东西)

#run all target when all of the files are available
all: variants.vcf filtered.vcf filtered2.vcf
mv -nv $(TEMPDIR)/*.vcf /test/newdest/

variants.vcf:
complexanalysis_tool input_file > variants.vcf

filtered.vcf:
complexanalysis_tool2 input_file2 > filtered.vcf

filtered2.vcf:
complexanalysis_tool3 input_file3 > filtered2.vcf

您可以使用 bash 脚本来调用此 make 文件:

#/bin/bash

export TEMPDIR=xyz
make -C $TEMPDIR all

make 实用程序将检查自己是否已完成任务,并跳过已完成任务的执行。它将在您完成任务时出错的地方继续。

您可以在 Internet 上找到有关 makefile 的确切语法的更多详细信息。

关于linux - 如何重新运行 bash 脚本,跳过之前成功运行的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34413982/

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