RETURNトラップの使用

RETURNトラップの使用

機能があるのにpipefailその中にあるオプションを使いたいです。しかし、set -o pipefailスクリプトの他の部分がpipefail設定されていないのではないかと心配され、単にこれをしたくありません。もちろんset +o pipefail、後で行うこともできますが、pipefail私の関数の外部で設定すると、予期しない動作が発生する可能性があります。

もちろん、設定すると終了コードをfalse | true指標として使用できますが、pipefailちょっと乱雑に見えます。

設定されたbashオプションをチェックするより一般的な(正規の?)方法はありますか?

ベストアンサー1

上記ではbash-4.4、次のものを使用できます。

myfunction() {
  local -
  set -o someoption
  ...
}

いくつかの注意:

  • これはからコピーされましたash。では(保存オプションセット)をローカルにするのがashアイデアです。では、変数の値や属性に影響を与えないために$-動作します(最初に設定されていない場所とは反対)。それにもかかわらず、特別な場合と同じように機能します。つまり、設定がオフになったり、デフォルトの動作に戻ることはありません。ashashlocalbashbashash$-
  • セットのオプションを使用するset -o optionのではなく、セットのオプションを使用することだけを扱いますshopt -s optionbashそして両方のオプションセットを持つ唯一のシェルです!)。
  • ローカル変数と同様に、静的ではなく動的にスコープされます。$-関数から返されると値は復元されますが、新しい設定は関数が呼び出す他の関数またはソーススクリプトに影響します。静的なスコープが必要な場合は、ksh93に切り替えて次のものを使用する必要があります。

    function myfunction {
      set -o myoption
      ...
      other_function
    }
    

    other_functionfunction other_function {Bourne構文ではなく構文を使用してother_function()...宣言されている限り、影響はありません。

  • オプションをリセットしないため、関数はまだ他のコードで設定されているオプションの影響を受ける可能性があります。これを防ぐためにそれを使用する必要がありますzsh。 iszshと同じですが、よく知られていますlocal -set -o localoptionsシミュレーションモデル地元の。たとえば、

    myfunction() {
      emulate -L zsh
      set -o someoption
      ...
    }
    

    合理的なzsh-defaultオプションセットで始まり(いくつかの例外があります。ドキュメントを参照)、その上にオプションを追加します。これはash / bashのようなダイナミックレンジでもありますが、次のように他の関数を呼び出すこともできます。

    emulate zsh -c 'other_function...'
    

    other_function通常のzshオプションセットを使用して呼び出します。

    zshには、最初からグローバルにオプションを変更することを防ぐことができるいくつかの演算子があります(例:(N)glob修飾子/ for / (D)、大文字と小文字を区別しないワイルドカードのためのglob演算子、、、)。nullglobdotglob(#i)${(s:x:)var}$IFS${~var}必要noglobパラメータ拡張時のグロービング(他のBourneと同様のシェルでこれを行う必要があります)避ける(!)それ)...

おすすめ記事