環境変数と関数パラメータ[閉じる]

環境変数と関数パラメータ[閉じる]

詳細レベルオプションを持つbash機能セットがあります。設定値に応じてさまざまな出力レベルが生成されます。詳細レベルは各機能によって異なります。

しかし、環境変数もあります。そのうちの1つは詳細レベルも指定します。新しいターミナルシェルに影響を与えるように設計されたグローバルな冗長ツールです。環境変数を使用してレベル 1 に設定すると、使用可能な端末コマンドの要約が印刷されます。

詳細な位置引数を使用して関数が呼び出され、環境変数も設定されていると仮定すると、ほとんどのユーザーはどのような動作を期待しますか?ローカル詳細設定を適用しますか、環境変数レベルを使用しますか?

答え1

関数はサブシェルではありません。関数の変数に対するすべての変更は、追加しない限り伝播されます。local

関数を括弧で囲んでサブシェルにすることができます。()

例ではtest.sh:

#!/bin/env bash

function amiasubshell {
    DISPLAY=$1
    echo amiasubshell: $DISPLAY
}

function nobuticanfakeit {
    local DISPLAY=$1
    echo nobuticanfakeit: $DISPLAY
}

echo main: $DISPLAY
amiasubshell :2
echo main: $DISPLAY
(amiasubshell :5)
echo main: $DISPLAY
nobuticanfakeit :28
echo main: $DISPLAY

最初のインスタンスは、amiasubshell本文の前に移動した値を変更します。 2番目のインスタンスはサブシェルなので、そうではありません。のインスタンスは変数nobuticanfakeitなので、関数コンテキストの値のみを変更します。local

main: :0
amiasubshell: :2
main: :2
amiasubshell: :5
main: :2
nobuticanfakeit: :28
main: :2

関連情報