1. ホーム
  2. bash

[解決済み] どのように呼び出されても、全ての実行を中断するBash関数を書く方法はありますか?

2023-02-11 10:14:10

質問

Bash関数で"exit 1"ステートメントを使ってスクリプト全体を終了させていましたが、問題なく動作しています。

function func()
{
   echo "Goodbye"
   exit 1
}
echo "Function call will abort"
func
echo "This will never be printed"

のように呼び出されても、仕事をしないことに気がつきました。

res=$(func)

サブシェルを作成し、"exit 1"で主シェルではなく、そのサブシェルを中止することは理解したのですが...。

しかし は、どのように呼び出されたかに関係なく、実行全体を中止する関数を書く方法はありますか? 私はちょうど本当の戻り値(関数によってエコーされる)を取得する必要があります。

どのように解決するのですか?

何を 可能 のトップレベルのシェルを登録することです。 TERM シグナルを送信して終了し、その後 TERM をトップレベルのシェルに送ります。

#!/bin/bash
trap "exit 1" TERM
export TOP_PID=$$

function func()
{
   echo "Goodbye"
   kill -s TERM $TOP_PID
}

echo "Function call will abort"
echo $(func)
echo "This will never be printed"

つまり、この関数が送信する TERM シグナルをトップレベルのシェルに送り返し、それをキャッチして提供されたコマンドを使用して処理します。 "exit 1" .