$ {arg?word}の失敗によって生成されたメッセージをクリーンアップすることは可能ですか?

bashがスクリプトを解釈して遭遇するとき

${arg?error message}

argが設定されていない場合、エラーメッセージを出力した後にスクリプトは終了します。残念ながら、bashはエラーメッセージに "$ 0:line $ LINENO:arg:"を付加します。追加情報を抑制することは可能ですか?私はエラーメッセージが正確に "エラーメッセージ"であることを望みます。

2

2 答え

おそらく $ {PARAMETER?WORD} の構文を避け、手動で行う必要があります。たとえば、次のようなもの

if [ -z "${arg+set}" ]; then
    printf 'error message\n' >&2
    exit 2
fi
2
追加された

私はあなたがこれをしたいと思っているならば、あなたはBashの中で最も自然な方法であなたの究極の目的を達成していないかもしれないと思います。これのようなものはより良いはずです:

if [ -z $arg ]; then
    echo error message >&2;
else
    $arg
fi

しかし、より直接的に質問に答える:

(${arg?error message}) |& sed "s/.*: .*: //"

Explanation: The |& connects the standard error of the block of code in the parentheses (which are necessary for this to work, by the way) into sed (stream editor), which strips off the part of the message you don't want with a regular expression.

0
追加された
@WilliamPursell実際、私はBashでテストしましたが、うまくいきました。
追加された 著者 Keith Pinson,
@WilliamPursell何らかの理由で |&がうまく動作しない場合は、 2>&1 | それは単に簡潔ではない。
追加された 著者 Keith Pinson,
|&はbashの構文エラーです。私はそれがcshの構築物だと信じています。
追加された 著者 William Pursell,