Bash - 从子脚本中退出父脚本

时间:2013-04-25 12:48:49

标签: bash

我有一个Bash父脚本,在意外的输入上调用记录错误的错误记录子脚本。我还希望在发生错误并调用错误脚本时暂停执行。但是,如果我从错误处理脚本中调用exit,它不会阻止父脚本执行。我怎样才能从孩子那里停止父脚本?

5 个答案:

答案 0 :(得分:11)

尝试..

#normal flow
[[ $(check_error_condition ]] && /some/error_reporter.sh || exit 1

所以,

  • 当error_reporter退出并退出状态> 0父母也会终止
  • 如果error_reporter将以status = 0退出,则父级继续...

你不希望stop the parent from a child父母通常不喜欢这种行为):),你想要tell to parent - need stop而他会自行停止(如果想要的话) );)

答案 1 :(得分:7)

尝试:

在父脚本中:

trap "echo exitting because my child killed me.>&2;exit" SIGUSR1

在儿童剧本中:

kill -SIGUSR1 `ps --pid $$ -oppid=`; exit

其他方式是:

在儿童剧本中:

kill -9 `ps --pid $$ -oppid=`; exit

但是,不建议这样做,因为父母需要有关于被杀的一些信息。因此,如果需要,可以进行一些清理。


另一种方式: 而不是调用子脚本,exec它。


然而,正如其他答案所指出,最简洁的方法是在孩子回来后退出父母。

答案 2 :(得分:0)

不要尝试终止孩子的父母。而是在子脚本返回后在父级中调用exit

if [ condition ]; then
  /path/to/child.sh
  exit 1
fi

或更短

[ condition ] && { /path/to/child.sh; exit 1; }

答案 3 :(得分:0)

扩展到@anishsane注释,因为MacOS的ps语法有点不同。

在Mac OS(Darwin)下的子脚本中查找父进程ID(ppid):

kill -SIGUSR1 $(ps $$ -o ppid=);exit

答案 4 :(得分:0)

根据您的需求,使用 set -e 在脚本顶部可能是一个很好的解决方案。如果任何命令(例如错误检查脚本)以非零退出代码(https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/)退出,这将自动导致脚本退出

请注意,在正常情况下,有些通用命令的退出代码为非零。