0

Linux 環境変数とシェル変数の違い

シェル変数は現在実行中のシェルだけで有効な変数
環境変数はシェルから実行したコマンドにも引き継がれる変数

これをコマンドで確認していきます。

■ シェル変数の基本

「=」を使用することで変数を格納します。また、変数の先頭に‘$’をつけることで、格納された値を参照出来ます。

$ echo $HOGE

$ HOGE=hogehoge
$ echo $HOGE
hogehoge

■ 環境変数について

上記は「シェル変数」と言われ、
そのシェル内でのみ有効な変数です。
例えば、以下のようなシェルスクリプトを用意し、

cat home.sh
#!/bin/sh
echo ${HOGE}

$ sh hoge.sh
               ←実行しても、何も表示されません。

「export」をつけると、その変数が「環境変数」となり、
子プロセスでも有効になります。

$ export HOGE
$ sh hoge.sh
hogehoge   ←表示される

逆に子の環境変数を親に引き継ぐには

基本的には、子の環境変数を親が使うことは出来ません。
試しにシェルスクリプト内で環境変数を定義してみますが、その環境変数は親のシェルでは有効ではありません。hoge2.shを作成し、テストしてみます。

$ cat hoge2.sh
$!/bin/sh
HOGE2=hoge2
export HOGE2

$ sh hoge2.sh
$ echo $HOGE2
        ←何も表示されない

しかし、「source」コマンドを使うと、現在のシェルに環境変数を定義出来ます。
source hoge とするのは、ファイル hoge に書かれた文字列を一つずつ自分の手でタイプしたのと同じことです。

UNIXの部屋 コマンド検索:source (*BSD/Linux)

# source hoge2.sh
# echo $HOGE2
hoge2

環境変数についてOS的観点からもう少し細かく見てみます。

環境変数 (environment variabl) はアプリケーションの挙動に関する設定を保存するための仕組みです。

■ LANG 環境変数を設定

export LANG=ja_JP.UTF-8

■ 変数を参照
echo $LANG
ja_JP.UTF-8

■ 一時的に環境変数を設定します
日本語が文字化けするので、英語版のマニュアルを参照したい
というシチュエーションで便利です

LANG=C man man

■ 現在有効な環境変数の一覧を表示

set

なお、環境変数をログインする度に手で入力することはありません。
~/.bashrc や ~/.bash_profile といったファイルで export 文を下記のように書いておきます。

~/.bashrc

PS1='`date "+%Y-%m-%d %H:%M:%S"`\[\033[32m\][\w]\[\033[0m\]\n\[\033[1;36m\]\u\[\033[1;33m\]@`hostname -s`-> \[\033[0m\]'
 
export LANG="ja_JP.UTF-8"
 
alias ls='ls --color -F'
 
push_path () {
  local new_path="$1"
  echo "$PATH" | grep "$new_path" > /dev/null || export PATH="$new_path:$PATH"
}
push_path "/usr/local/ruby-2.0.0-p353/bin"
unset push_path

■ よく使う環境変数たち

PATH
コマンドサーチパスを設定します。
コマンドラインで vi と入力すると /usr/bin/vi が起動しますが、
これは PATH 環境変数に /usr/bin が含まれるからです。
もし /usr/bin が含まれてないと、「コマンドが見つかりません」というエラーが発生します。

サーチパスは : (コロン) で区切ることで複数設定することができます。コマンドは左のパスから順番に検索され、
最初に見つかったコマンドが起動(先勝ち)されます。

which ruby
/usr/bin/ruby

#サーチパスに /usr/local/ruby-2.0.0-p353/bin を追加します。
export PATH=/usr/local/ruby-2.0.0-p353/bin/ruby:$PATH
↑
このパスの通し方だと、which ruby を検索した時は、先勝方式で/usr/local/ruby-2.0.0-p353/bin/ruby が実行される。

which ruby
#/usr/local/ruby-2.0.0-p353/bin/ruby

LANG
ロケール (自然言語、通貨単位、日付の書式等の組み合わせ) を設定します。この環境変数を参照するアプリケーションは非常に多いです。この変数には ja_JP.UTF-8 を設定することがほとんどです。ja_JP の部分がロケールの名前です (Slackware では、利用可能なロケールの定義ファイルが /usr/share/i18n/locales に置いてあります)。ja が言語名、JP が国名です。UTF-8 や eucJP はエンコード方式です。LANG=C にするとデフォルトの設定 (英語) になります。

export LANG=ja_JP.UTF-8

EDITOR
どのテキストエディタを使用するか設定します。visudo や crontab コマンドが参照します。Slackware の標準のエディタは vi で、EDITOR 環境変数は未定義です。この変数には vim を設定しておくと良いと思います。

export EDITOR=/usr/bin/vim

PAGER
どのページャを使用するか設定します。ページャは長いテキストファイルを 1 画面ごとに分割して表示してくれる有り難いツールで、more, less, pg 等があります。ページャを使用するアプリケーションは、例えば man コマンドがあります。Slackware の標準のページャは less で、PAGER 環境変数は未定義です。PAGER=cat とすると苦しむことができます。

export PAGER=/usr/bin/less

PS1
コマンドプロンプトを設定します。個性が現れるところです。8 Useful and Interesting Bash Prompts とか参考。

SHELL
現在動作中のシェルのフルパスが自動的に設定されます。大抵の Linux システムは bash ですが、
AIX*注*やOpenBSD は ksh (コーンシェル) がデフォルトのシェルだったと思います。
「あれ、シェルの挙動がおかしい!」と思ったら、echo $SHELL を実行してみてください。
* 注: wikiより転載 *
AIX(Advanced Interactive Executive、エーアイエックス)
IBM の UNIX オペレーティングシステムのブランド名である。

AIX は UNIX System V Release 3 (SVR3) ベースの IBM のオペレーティングシステムで、The Open Group の UNIX認証を受けている。最新版の AIX 7.1 では、カーネルは 64-bit で、POWER 系の CPU(POWER4、POWER5、POWER6、PowerPC 970、POWER7)をサポートする。AIXは、IBM の RT-PC、RS/6000、pSeries、System p、Power Systems シリーズの他、フランスの Bull や、日立製作所の EP8000 シリーズやSR16000で採用されており、主に信頼性・可用性・高速性が求められる用途に使われている。

AIX は System V Release 3 (SVR3) をベースに、更に BSD や System V Release 4 (SVR4) などのコマンド等を追加したものである。このため SVR4 ベースの他の商用 UNIX(Solaris など)や、UNIX 互換 OS である Linux OS などとはコマンド体系が多少異なる。AIX V3 までは Bourne Shell をデフォルトのシェルとしていたが、AIX V4 以降はXPG4とPOSIXに準拠するため Korn Shell (ksh88) をデフォルトのシェルとするようになった。
以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です