機能があるのにpipefail
その中にあるオプションを使いたいです。しかし、set -o pipefail
スクリプトの他の部分がpipefail
設定されていないのではないかと心配され、単にこれをしたくありません。もちろんset +o pipefail
、後で行うこともできますが、pipefail
私の関数の外部で設定すると、予期しない動作が発生する可能性があります。
もちろん、設定すると終了コードをfalse | true
指標として使用できますが、pipefail
ちょっと乱雑に見えます。
設定されたbashオプションをチェックするより一般的な(正規の?)方法はありますか?
ベストアンサー1
上記ではbash-4.4
、次のものを使用できます。
myfunction() {
local -
set -o someoption
...
}
いくつかの注意:
- これはからコピーされました
ash
。では(保存オプションセット)をローカルにするのがash
アイデアです。では、変数の値や属性に影響を与えないために$-
動作します(最初に設定されていない場所とは反対)。それにもかかわらず、特別な場合と同じように機能します。つまり、設定がオフになったり、デフォルトの動作に戻ることはありません。ash
ash
local
bash
bash
ash
$-
- セットのオプションを使用する
set -o option
のではなく、セットのオプションを使用することだけを扱いますshopt -s option
(bash
そして両方のオプションセットを持つ唯一のシェルです!)。 ローカル変数と同様に、静的ではなく動的にスコープされます。
$-
関数から返されると値は復元されますが、新しい設定は関数が呼び出す他の関数またはソーススクリプトに影響します。静的なスコープが必要な場合は、ksh93に切り替えて次のものを使用する必要があります。function myfunction { set -o myoption ... other_function }
other_function
function 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演算子、、、)。nullglob
dotglob
(#i)
${(s:x:)var}
$IFS
${~var}
必要noglob
パラメータ拡張時のグロービング(他のBourneと同様のシェルでこれを行う必要があります)避ける(!)それ)...