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个步骤 有什么想法吗?谢谢您可以按照您作为输入的方式编写代码,它应该从

我正在寻找一种解决方案,当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.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事实上你是对的,我自己也在想——在发布之后。。)但后来我没能删除它。我还是会说,不管我们有多爱贝壳