STDOUTを変数に割り当てるときのシェルスクリプトエラーの処理

STDOUTを変数に割り当てるときのシェルスクリプトエラーの処理

2番目の答えで述べたように、シェルスクリプトでエラー処理を実装しようとしています。$?使用のベストプラクティス バッシュから?

私のスクリプトは次のとおりです

#!/bin/bash

try() {
    "$@"
    code=$?
    if [ $code -ne 0 ]
    then
        echo "oops $1 didn't work"
        exit 1
    fi
}

try myvar=$(mktemp -p ./)

スクリプトは次のように終了します。

./test.sh: line 4: myvar=./tmp.scNLzO1DDi: No such file or directory
oops myvar=./tmp.scNLzO1DDi didn't work

ただ、

myvar=$(mktemp -p ./)

もちろんうまくいきます。 $ myvarは一時ファイルのフルパスと名前を返します。

try() が必要な操作を実行できるように、文全体とその結果を try() に渡しながら、tmp ファイルの名前を変数 myvar に代入する文をどのように取得できますか?ありがとうございます。

答え1

使用すると、引数リストの生成中に呼び出しが行われる前にtry myvar=$(mktemp -p ./)with サブシェルが実行されます。mktmptrytry

後でサブシェルを拡張するには、次のパラメータを引用する必要がありますtry

try 'myvar=$(mktemp -p ./)'

後で拡張するには、最初の行の代わりにをeval "$@"使用する必要があります。"$@"try

答え2

評価されたラッパーの代わりにエラートラップを使用したいと思います。

err_handler () {
    code=$?
    if [ $code -ne 0 ]
    then
        echo "oops $1 didn't work"
        exit 1
    fi
}

trap 'err_handler' ERR
myvar=$(mktemp -p ./)
trap ERR

関連情報