詳細レベルオプションを持つ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