GNU/Linux >> Linux の 問題 >  >> Linux

シェル変数と環境変数の使用法の違いは?

コマンドラインからアクセスできる変数には2つの異なるタイプがあることを実際には知りませんでした。私が知っていたのは、次のような変数を宣言できることだけです。

foo="my dear friends"
bar[0]="one"
bar[1]="two"
bar[2]="three"

または、次のように$記号でアクセスします:

echo $foo
echo ${bar[1]}

または、次のような組み込み変数を使用します:

echo $PWD
PATH=$PATH:"/usr/bin/myProg"

さて、変数にはシェル変数と環境変数の2種類(少なくとも?)があると聞きました。

  • 2つの異なるタイプを持つ目的は何ですか?
  • 変数がどのタイプであるかを知るにはどうすればよいですか?
  • それぞれの一般的な使用法は何ですか?

承認された回答:

環境変数は、name=valueのリストです。 プログラムが何であれ(シェル、アプリケーション、デーモン…)存在するペア。これらは通常、子プロセスによって継承されます(forkによって作成されます) / exec シーケンス):子プロセスは、親変数の独自のコピーを取得します。

シェル変数は、シェルのコンテキストにのみ存在します。それらはサブシェルでのみ継承されます(つまり、シェルがexecなしでフォークされた場合 手術)。シェルの機能によっては、変数は環境変数のような単純な文字列だけでなく、配列、複合変数、整数や浮動小数点などの型変数などもあります。

シェルが起動すると、親から継承するすべての環境変数もシェル変数になります(シェル変数として無効な場合や、IFSなどの他のコーナーケースを除く)。 これは一部のシェルによってリセットされます)が、これらの継承された変数はエクスポート済みとしてタグ付けされます。つまり、シェルによって設定された更新される可能性のある値を使用して、子プロセスで引き続き使用できるようになります。これは、シェルの下で作成され、exportでエクスポートされたものとしてタグ付けされた変数の場合にも当てはまります。 キーワード。

配列およびその他の複合型変数は、名前と値をname=valueに変換できない限り、エクスポートできません。 パターン、またはシェル固有のメカニズムが設定されている場合(例:bash 環境内の関数と、rcなどのいくつかのエキゾチックな非POSIXシェルをエクスポートします およびes 配列をエクスポートできます)。

したがって、環境変数とシェル変数の主な違いは、そのスコープです。環境変数はグローバルですが、エクスポートされていないシェル変数はスクリプトに対してローカルです。

最新のシェル(少なくともksh およびbash )3番目のシェル変数スコープをサポートします。 typesetを使用して関数で作成された変数 キーワードはその関数に対してローカルです(関数が宣言される方法は、kshでこの機能を有効/無効にします 、および永続性の動作はbash間で異なります およびksh )。 https://unix.stackexchange.com/a/28349/2594

を参照してください 関連:「regsave」と「regexport」の違いは?

これはkshのような最新のシェルに適用されます 、dashbash および同様。従来のBourneシェルとcshのような非Bourne構文シェル 動作が異なります。


Linux
  1. 組み込みコマンドとそうでないコマンドの違いは?

  2. 「…」、「…」、$’…’、および$“…”の引用符のシェルでの違いは?

  3. [[$ a ==Z*]]と[$a==Z *]の違いは?

  1. .exrcと.vimrcの違いは?

  2. 検索コマンドの '{}' と {} の違いは?

  3. unlink と rm の違いは何ですか?

  1. InnoDBとMyISAMの違いは何ですか?

  2. ログインシェルと非ログインシェルの違いは?

  3. Sudo Su –とSudo Su —の違いは何ですか?