bash関数は、$()によって呼び出されたときにローカル変数の値を変更できません


3

次のコードは、Parse_Short_Switches()が呼び出される方法に応じて動作が異なります。result = $(Parse_Short_Switches)を使用して関数 'Parse_Short_Switches'を呼び出した後、$ error_flagの値は予想どおり-1に設定されません。

単純にParse_Short_Switchesを使用して関数 'Parse_Short_Switches'を呼び出した後、$ error_flagの値は予想どおり-1に設定されます。

どんな助けも大歓迎です。ありがとう

#!/bin/bash

function Parse_Short_Switches()
{
echo "error_flag inside of the function= $error_flag" 1>&2
error_flag="-1"
echo "blah blah ..."
}

# --- MAIN ---
error_flag="999"
echo "error_flag= $error_flag"
#result=$(Parse_Short_Switches)
Parse_Short_Switches
echo "error_flag= $error_flag"

回答:


3

これは、コマンド置換$()がサブシェルを生成し、内部のコマンドがそのサブシェルで実行されるためです。

したがって、データ構造に加えられた変更は、親シェルに伝搬されません。言い換えると、変更はサブシェルを除いてすべて適切に行われているため、親シェルの関連パラメーターは影響を受けません。

サイドノートとして、スクリプトを実行すると、サブシェルで実行されます。パラメータのすべての変更を呼び出しシェルで使用可能にするための一般的なトリックは、スクリプトをsource.)することです。

例:

$ foo() { bar=2 ;}

$ bar=1

$ $(foo)

$ echo "$bar"
1

$ foo

$ echo "$bar"
2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.