Bash-按步骤进行错误恢复
我正在寻找一种解决方案,当bash脚本以前失败时,在定义的步骤重新启动它 例如,我有一个bash脚本:Bash-按步骤进行错误恢复,bash,Bash,我正在寻找一种解决方案,当bash脚本以前失败时,在定义的步骤重新启动它 例如,我有一个bash脚本: #my_script.sh: #Step 1 Action 1 #Step 2 Action 2 #Step 3 Action 3 #Step 4 Action 4 在步骤3失败后,我希望能够这样称呼它: /my_script.sh步骤3 因此,它将从步骤3开始,而不重做前2个步骤 有什么想法吗?谢谢您可以按照您作为输入的方式编写代码,它应该从
#my_script.sh:
#Step 1
Action 1
#Step 2
Action 2
#Step 3
Action 3
#Step 4
Action 4
在步骤3失败后,我希望能够这样称呼它:
/my_script.sh步骤3
因此,它将从步骤3
开始,而不重做前2个步骤
有什么想法吗?谢谢您可以按照您作为输入的方式编写代码,它应该从以下步骤开始:/my_script.sh3
。然后,您可以在代码中使用case语句作为“输入”$1
,这是您作为输入给出的步骤。我不会为您编写代码,但如果您需要进一步的帮助,请发布您的解决方案,我很高兴为您提供一些提示。您可以按照您作为输入的方式编写代码,它应该从以下步骤开始:/my_script.sh3
。然后,您可以在代码中使用case语句作为“输入”$1
,这是您作为输入给出的步骤。我不会为您编写代码,但如果您需要进一步的帮助,请发布您的解决方案,我很高兴为您提供一些提示。我假设如果步骤2失败,您希望从那里重新启动,并且该步骤取决于前面的步骤1。。N-1
解决这个问题的一种方法是在运行脚本时创建戳记文件
完成步骤1时,只需触摸步骤1戳记
,完成步骤2时触摸步骤2戳记
,以此类推
每个步骤在执行其任务之前都会检查该步骤的戳记是否存在,例如,对于步骤N
:
if [ ! -f "stepN-stamp" ]; then
# do tasks for step N
touch stepN-stamp
fi
使用Makefile的类似方法:
.PHONY: all clean
all: step3-stamp
step1-stamp:
@echo "Performing step 1"
@touch step1-stamp
step2-stamp: step1-stamp
@echo "Performing step 2"
@touch step2-stamp
step3-stamp: step2-stamp
@echo "Performing step 3"
@touch step3-stamp
clean:
rm -f step[123]-stamp
注意:这都是假设您不想运行随机步骤。您可以做的是删除一个或多个戳记文件,然后从头开始重新运行整个过程。特别是Makefile解决方案将优雅地处理此问题,因为它将强制重新运行相关步骤。我假设如果步骤2失败,您希望从那里重新启动,并且该步骤取决于前面的步骤
N
。。N-1
解决这个问题的一种方法是在运行脚本时创建戳记文件
完成步骤1时,只需触摸步骤1戳记,完成步骤2时触摸步骤2戳记,以此类推
每个步骤在执行其任务之前都会检查该步骤的戳记是否存在,例如,对于步骤N
:
if [ ! -f "stepN-stamp" ]; then
# do tasks for step N
touch stepN-stamp
fi
使用Makefile的类似方法:
.PHONY: all clean
all: step3-stamp
step1-stamp:
@echo "Performing step 1"
@touch step1-stamp
step2-stamp: step1-stamp
@echo "Performing step 2"
@touch step2-stamp
step3-stamp: step2-stamp
@echo "Performing step 3"
@touch step3-stamp
clean:
rm -f step[123]-stamp
注意:这都是假设您不想运行随机步骤。您可以做的是删除一个或多个戳记文件,然后从头开始重新运行整个过程。特别是Makefile解决方案将优雅地处理此问题,因为它将强制重新运行相关步骤。
bash
4在其case
语句中使用&代码>终止符
# Contents of script
case ${1:-step1} in
step1) echo "Running step 1" ;&
step2) echo "Running step 2" ;&
step3) echo "Running step 3" ;&
step4) echo "Running step 4" ;&
step5) echo "Running step 5" ;;
*) echo "Unrecognized starting point: $1"; exit 1 ;;
esac
运行此脚本:
$ bash script step3
Running step 3
Running step 4
Running step 5
bash
4在其案例中使用语句引入了fall-through行为&代码>终止符
# Contents of script
case ${1:-step1} in
step1) echo "Running step 1" ;&
step2) echo "Running step 2" ;&
step3) echo "Running step 3" ;&
step4) echo "Running step 4" ;&
step5) echo "Running step 5" ;;
*) echo "Unrecognized starting point: $1"; exit 1 ;;
esac
运行此脚本:
$ bash script step3
Running step 3
Running step 4
Running step 5
好主意!我还建议在创建步骤N中的戳记后,删除步骤N-1中的戳记。@mik1904否。您只会在完成所有操作后删除戳记。使用shell脚本解决方案,删除戳N-1
当N
完成时,将在重新运行脚本时重新运行N-1
任务。使用Makefile解决方案,删除戳记N-1
当N
完成时,N-1
步骤和所有后续步骤(即依赖于步骤N-1
的每个步骤)将在重新运行make
时重新运行。我明白了,因为每次运行脚本时都会检查每个戳记,如果它存在,就继续运行。所以你不需要输入这个步骤,因为它是自动的。对不起,现在我明白了。很好。@mik1904啊,我知道你是怎么想的。我会澄清的,好主意!我还建议在创建步骤N中的戳记后,删除步骤N-1中的戳记。@mik1904否。您只会在完成所有操作后删除戳记。使用shell脚本解决方案,删除戳N-1
当N
完成时,将在重新运行脚本时重新运行N-1
任务。使用Makefile解决方案,删除戳记N-1
当N
完成时,N-1
步骤和所有后续步骤(即依赖于步骤N-1
的每个步骤)将在重新运行make
时重新运行。我明白了,因为每次运行脚本时都会检查每个戳记,如果它存在,就继续运行。所以你不需要输入这个步骤,因为它是自动的。对不起,现在我明白了。很好。@mik1904啊,我知道你是怎么想的。我将澄清这一点。让你的生活和你的同事生活更容易,并考虑使用一个真正的编程语言。@ HEK2MGL没有足够的细节来知道shell是否是错误的语言。如果操作只是运行其他问题,shell当然是一个不错的选择。@chepner事实上你是对的,我自己也在想——在发布之后。。)但后来我没能删除它。尽管如此,我还是要说,不管我们多么喜欢使用shell,它只是应用程序开发的错误工具。对于非常有限的任务来说,这没关系。在复杂的情况下受到限制。如果最初的任务随着时间的推移而改变,那么它几乎总是变得一团糟。可能是错误的问题下面的正确评论。让你的生活和你的同事的生活更容易,并考虑使用一个真正的编程语言。@ HEK2MGL没有足够的细节来知道shell是否是错误的语言。如果操作只是运行其他问题,shell当然是一个不错的选择。@chepner事实上你是对的,我自己也在想——在发布之后。。)但后来我没能删除它。我还是会说,不管我们有多爱贝壳