-1

Perl スタイルの「or die」を持つ Bash 関数があります。例えば、

#!/bin/bash
func1 () {
    local val
    val=`cat foobar` || exit 7
    echo "func1: cat returns $?"
}

myval=`func1`
echo "Line X should not be reached (retn = $? val = $myval)"
myval=$(func1)
echo "Line Y should not be reached (retn = $? val = $myval)"
func1
echo "Line Z should not be reached (retn = $?)"

関数を直接呼び出すと、exit. しかし、関数が使用したい値を返す場合、コマンド置換はexit. つまり、exit は戻り値に格納されるだけで$?、次の行が実行されます。

デバッグ オプションを指定して実行-xすると、コマンド置換がサブシェルに似ていることがわかります。これは、bash がより深いネストを出力するためです。そのexitため、メイン スクリプトには適用されません。

出力例:

cat: foobar: No such file or directory
Line X should not be reached (retn = 7 val = )
cat: foobar: No such file or directory
Line Y should not be reached (retn = 7 val = )
cat: foobar: No such file or directory

func1 を呼び出して、その出力を (変数、ループ、if などで) 使用しながら、ショートサーキットを活用する方法はありexitますか?

4

1 に答える 1

0

この単純なコードを SIGHUP シグナル ハンドラーを含めて使用することができます。希望どおりに完全に機能します :)

hndlHUP () {
    exit 7
}
func1 () {
    local val
    val=$(cat foobar) || kill -SIGHUP $$
    echo "func1: cat returns $?"
}

trap hndlHUP SIGHUP

myval=`func1`
echo "Line X should not be reached (retn = $? val = $myval)"
myval=$(func1)
echo "Line Y should not be reached (retn = $? val = $myval)"
func1
echo "Line Z should not be reached (retn = $?)"
于 2014-11-27T13:51:10.093 に答える