例えば、私がパラメータ拡張:
$ b=1
$ echo $b
1
内部的にはどこにb
保存されますか? 確認しましたが、 にリストされていないので環境変数ではありませんprintenv
。 Unix を学習するために独自のシェルを作成しており、ハッシュテーブルを使用して変数を「シンボル検索テーブル」として保存および取得しています。この方法は適切な方法でしょうか、それとも他の方法をお勧めしますか?
答え1
ログインしてコマンドを読み取って実行するときに実行されるシェルは、すべての変数を保持します。2 番目のシェルを実行すると、独自の変数コレクションが保持されます。コマンドを実行して、set
変数のリストを表示できます。set
コマンドは、新しいプロセスを起動するのではなく、シェル内で実行されます。
環境変数は別のスペースに保存されるか、そのようにフラグが付けられ (重要な場合は、シェルのソース コードを読んでください)、シェルによって実行されるプログラムに渡されます。
2 つのハッシュテーブルを使用するのが合理的であるように思われます。
答え2
これはプログラムの実行中のみの変数です。これについて考える別の方法は、プログラムを次のように書き直すことです。
#!/bin/bash
b=1
echo $b
exit
さて、これをターミナル内で実行し、そのターミナルセッションを終了するとします。別のターミナルセッションを開いても、何でもb=1
前回のセッションでのその課題に関して。
これは「グローバル変数」ではなく「ローカル変数」と呼ばれます。これらは、他の多くの関数とともに、 を使用して表示されますset
。
課題を見たい方は
set |grep '^b='
b=1
参照してくださいLinux ドキュメンテーション プロジェクト詳細については。
答え3
シェル変数は、実行中のシェルのメモリに保存されます。名前を指定して項目を簡単に検索できるデータ構造を使用します。ハッシュ テーブルが適しています。
シェル変数と環境変数の違いは、環境変数はサブプロセスの環境に配置されることです。すべての環境変数はシェル変数です。これらを保存する自然な方法は、変数名を値ではなく、値といくつかのフラグ (エクスポート、読み取り専用など) を含む構造にマップするハッシュ テーブルを作成することです。