Bashがどのように再帰で動作するかを簡単にテストしましたが、結果はわかりません。Bash-4再帰の奇妙な結果
試験:
- シェル
- にグローバル変数
X
を割り当てる割り当てlocal X
同じ名前の変数local X
- を割り当てる機能
f()
グローバルX
の値を作成local X=$X
すなわち
- この関数を数回繰り返し、各再帰でグローバル
X
またはを使用するかどうかを確認しますX
内すなわち、各再帰で- 、以前
f()
からlocal X
X
新しい「グローバル」になり、私は2つの結果の一つが予想
- 、以前
機能の前のターンから各再帰が以前のスコープの下に新しいスコープを作成することを示す次のスコープ。
local X
の値は忘れられ、新しい各local X=$X
は最初に割り当てたグローバルX
。これは、Bashが隣接するスコープを作成することを示します。私はこれらを取得しませんでした。私は奇妙な何かを得た。以下は、端末からのコピー貼り付けです。
Iシェルのグローバル変数を割り当てる:
[email protected]:~$ X=1
Iはlocal X
を作成するシェルで機能f()
を作成し、それをグローバルX
の値を割り当てwhileループに入り、に1を加算local X
(私はローカルのものと仮定します)、新しいlocal X
値を出力し、それ自身を呼び出します。 5または6回繰り返します。
[email protected]:~$ f() { local X=$X; while [ $X -lt 6 ]; do X=$(($X + 1)); echo $X; sleep 1; f; done; }
私はf()
を呼び出し、出力はうんざりです。
[email protected]:~$ f
2
3
4
5
6
6
5
6
6
4
5
6
6
5
6
6
3
4
5
6
6
5
6
6
4
5
6
6
5
6
6
この時点で、それ自体は終了しました。予想通り、グローバルX
は影響を受けませんでした。
[email protected]:~$ echo $X
1
ここでは何が起こっているのですか?グローバルX
、時にはlocal X
を使用することがありますか?もしあなたがここで何が起こっているのか分かっていれば、私はその細部を忘れないでください。
最後に、ちょうど楽しみのために、出力のグラフ:
1 ==
2 ===
3 ====
4 =====
5 ======
6 ======
7 =====
8 ======
9 ======
10 ====
11 =====
12 ======
13 ======
14 =====
15 ======
16 ======
17 ===
18 ====
19 =====
20 ======
21 ======
22 =====
23 ======
24 ======
25 ====
26 =====
27 ======
28 ======
29 =====
30 ======
31 ======
仕様:
- バッシュ-4.4。5(1)疑いで31本の出力ラインがありますが、
- x86_64版のUbuntuピリッ
- Linuxカーネル4.10.0-17ジェネリック
- VMware Workstationの12の仮想マシン
非常に興味深いです。 – someguy54321