4年ぐらい前に、どハマりしたドットコマンド

カレントディレクトリを示す”.”をコマンドとして使うことについて、当時知識がなく意味が分からないながら、オマジナイのように使ってました。
今頃になってようやく利用方法がわかりましたのでメモしておきます。


  • スクリプトの中で定義したシェル変数がスクリプト終了後に表示できない。
こんなシェル変数を定義するだけのシェルスクリプト"testvalue.sh"を作ります。
#!/bin/sh
TESTVALUE=testvalue
しかし”testvalue.sh"を実行し、シェル変数を表示しようとしても何も出てきません。
$ ./testvalue.sh
$ echo $TESTVALUE

  • なぜシェル変数が表示されないのか。
【理由】
シェルスクリプト実行開始時に子シェルが生成され、子シェルの中でシェル変数を定義するものの、シェルスクリプト終了時、子シェル消滅と共にシェル変数も消滅するから。

  • シェルスクリプト内で定義したシェル変数をスクリプト終了後も使えるようにするにはどうすれば良いか。
ちょっとわかりにくいですが、こうです。(./testvalue.shの前にドットコマンドを入力しています。)
$ . ./testvalue.sh
$ echo $TESTVALUE
testvalue
こうすると、シェルスクリプト内で定義したシェル変数が、スクリプト実行後も使えます。
  • 活用事例
複数のビルド環境を混在させており環境変を極力汚したくない。シェルスクリプトで沢山のシェル変数を定義し、そのシェル変数を使ってビルドしたいなんてときに便利です。

また、現在のシェルで手打ちしたシェル変数を、シェルスクリプトの中で使いたいときも、ドットコマンドが使えます。たとえば、こんな"echotestvalue.sh"を作ります。
#!/bin/sh
echo $TESTVALUE
で、シェル変数TESTVALUEを事前に定義しておいてechotestvalue.shを実行すると、シェル変数の値testvalueが表示されます。
$ TESTVALUE=testvalue
$ . ./echotestvalue.sh
testvalue

  • 追記
bashにおいて、sourceコマンドとドットコマンド「.」は同じ意味らしい。
しかし、bashの前身であるsh(化石)ではドットコマンド「.」しか効かないことがあったらしい。

スポンサードリンク