サブシェルが親を直接終了させることができないという事実を回避する方法はありません。親は、サブシェルから返された値を評価する必要があります。一般的な手法は、終了をトラップし、トラップ関数でエラー メッセージを出力することです。サブシェルでエラー メッセージを生成しているため、他の方法で行われるように単純にメッセージを変数に割り当てることはできませんが、ファイル システムを使用することはできます。この考え方は本当にばかげていることに注意してください。単純にエラー メッセージを stderr に書き込む方がはるかにクリーンです。それがそのためであり、それが子供たちに受け継がれる理由です。何かのようなもの:
#!/bin/sh
trap final 0 2 15
# Create a temporary file to store error messages. This is a terrible
# idea: it would be much better to simply write error messages to stderr,
# but this code is attempting to demonstrate the technique of having the
# parent print the message. Perhaps it would do better to serve as an example
# of why reporting your children's mistakes is a bad idea. The children
# should be responsible for reporting their own errors. Doing so is easy,
# since they inherit file descriptor 2 from their parent.
errmsg=$( mktemp xxxxx )
final() {
test "$?" = 0 || cat $errmsg
rm -f $errmsg
} >&2
# Must emphasize one more time that this is a silly idea. The error
# function ought to be writing to stderr: eg echo "error: $*" >&2
error() { echo "error: $*" > $errmsg; exit 1; }
do_sth() {
if test "$1" -eq 0; then
error "First param must be greater than 0!"
else
echo "OK!"
fi
}
result=$( do_sth 0 ) || exit 1
echo not printed