我有一个Bash父脚本,在意外的输入上调用记录错误的错误记录子脚本。我还希望在发生错误并调用错误脚本时暂停执行。但是,如果我从错误处理脚本中调用exit
,它不会阻止父脚本执行。我怎样才能从孩子那里停止父脚本?
答案 0 :(得分:11)
尝试..
#normal flow
[[ $(check_error_condition ]] && /some/error_reporter.sh || exit 1
所以,
你不希望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/)退出,这将自动导致脚本退出
请注意,在正常情况下,有些通用命令的退出代码为非零。