Jump to content 日本-日本語

製品  >  ソフトウェア  >  HP-UX   >  Knowledge-on-Demand  >  UNIXの教科書 応用編

UNIXの教科書 応用編
〜はじめよう! WindowsとLinuxからのステップアップ〜

第6日目:シェルの環境設定

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
第6日目:シェルの環境設定
UNIXの教科書 応用編〜はじめよう!WindowsとLinuxからのステップアップ〜 6日目
エイリアスと変数
シェルの環境設定ファイル

2時間目:シェルの環境設定ファイル

エイリアスや変数の設定はログアウトするとクリアされます。毎回同じ設定を行いたい場合には、ログイン時に自動的に読み込まれるシェルの環境設定ファイルに記述しておくとよいでしょう。この時間では、まずシェル環境を設定する環境変数と呼ばれる変数について説明し、次に環境設定ファイルの概要について説明します。

環境変数とは

シェル変数はそのシェルの内部でのみ使うことができる変数で、シェルの設定を変更したり、シェルスクリプトで変数に使ったりします。

一方、環境変数はシェルを含むすべてのUNIXプロセスで持つことができる変数で、シェルやシェルから起動したコマンドの動作を変えるのに使います。あるプロセスから別のプロセスを起動した場合、起動した側のプロセスを親プロセス、起動された側のプロセスを子プロセスと呼びます。シェルからコマンドを起動した場合には、シェルが親プロセス、コマンドが子プロセスとなります。通常のシェル変数と環境変数の相違はその値が子プロセスに引き継がれるかどうかであり、環境変数のみが引き継がれます。たとえば、シェルからコマンドを実行した場合、シェルで設定された環境変数は引き継がれますので、コマンドはその環境変数に応じた動作を行えるわけです。

現在設定されている環境変数の一覧はprintenvコマンドで確認できます。

$ printenv 【Enter】
_=/usr/bin/printenv
MANPATH=/usr/share/man/%L:/usr/share/man:/usr/contrib/man/%L:/usr/contrib/man:/usr/local/man/%L:/usr/local/man:/opt/ldapux/share/man/%L:/opt/ldapux/share/man:/opt/ipf/man:/opt/ldapux/ypldapd/man:/opt/samba/man:/opt/samba/WTEC_Support_Tools/man:/opt/samba/cfsm_man:/opt/cifsclient/share/man:/opt/openssl/man:/opt/openssl/prngd/man:/opt/wbem/share/man:/opt/graphics/common/man:/opt/amgr/man:/opt/amgr/man/%L:/opt/sec_mgmt/share/man:/usr/dt/share/man:/opt/drd/share/man/%L:/opt/drd/share/man:/opt/dsau/man:/opt/resmon/share/man/%L:/opt/resmon/share/man:/opt/gnome/man:/usr/contrib/kwdb/share/man:/opt/perl_32/man:/opt/perl_64/man:/opt/sfmdb/pgsql/man:/opt/sfm/share/man:/opt/swm/share/man/%L:/opt/swm/share/man:/opt/sec_mgmt/share/man/%L:/opt/ssh/share/man:/opt/swa/share/man/%L:/opt/swa/share/man:/opt/VRTS/man:/opt/gwlm/man/%L:/opt/gwlm/man:/opt/ignite/share/man/%L:/opt/ignite/share/man:/opt/hpsmdb/pgsql/man:/opt/mx/share/man/%L:/opt/mx/share/man:/opt/perf/man/%L:/opt/perf/man:/opt/prm/man/%L:/opt/prm/man:/opt/wlm/share/man/%L:/opt/wlm/share/man:/opt/mpi/share/man:/opt/vse/man/%L:/opt/caliper/man/%L:/opt/caliper/man:/opt/mlib/share/man:/opt/sentinel/man/%L:/opt/sentinel/man:/opt/spb/share/man:/opt/langtools/share/man/%L:/opt/langtools/share/man
SSH_TTY=/dev/pts/0
PATH=/usr/bin:/usr/ccs/bin:/usr/contrib/bin:/usr/contrib/Q4/bin:/opt/perl/bin:/opt/ipf/bin:/opt/nettladm/bin:/opt/fcms/bin:/opt/wbem/bin:/opt/wbem/sbin:/opt/sas/bin:/opt/graphics/common/bin:/opt/atok/bin:/usr/bin/X11:/usr/contrib/bin/X11:/opt/sec_mgmt/bastille/bin:/opt/drd/bin:/opt/dsau/bin:/opt/dsau/sbin:/opt/resmon/bin:/opt/gnome/bin:/usr/contrib/kwdb/bin:/opt/firefox:/opt/mozilla:/opt/perl_32/bin:/opt/perl_64/bin:/opt/sfm/bin:/opt/swm/bin:/opt/sec_mgmt/spc/bin:/opt/ssh/bin:/opt/swa/bin:/opt/hpsmh/bin:/opt/gwlm/bin:/opt/mx/bin:/opt/perf/bin:/opt/prm/bin:/opt/wlm/bin:/opt/mpi/bin:/opt/vse/bin:/opt/caliper/bin:/opt/ignite/bin:/var/opt/netscape/server7/shared/bin:/var/opt/netscape/server7/bin:/opt/sentinel/bin:/opt/java1.4/jre/bin:/opt/spb/bin:/opt/thunderbird:/opt/langtools/bin:.
COLUMNS=80
EDITOR=vi
LOGNAME=o2
MAIL=/var/mail/o2
SFTP_UMASK=
ERASE=^H
SFTP_PERMIT_CHOWN=1
USER=o2
DISPLAY=192.168.1.14:10.0
SHELL=/sbin/sh
HOME=/home/o2
SSH_CONNECTION=192.168.1.102 52508 192.168.1.14 22
SSH_CLIENT=192.168.1.102 52508 22
TERM=xterm
PWD=/home/o2/Documents/2009/info
TZ=JST-9
SFTP_PERMIT_CHMOD=1
LINES=24

たとえば、環境変数「LOGNAME」と「USER」にはユーザー名が、「TZ」にはタイムゾーンが格納されています。また、PATHにはコマンドが保存されているディレクトリの絶対パスがコロン「:」で区切られて格納されています。

四色君:
特定の環境変数の値だけ表示することもできますか?
四色君
マリー先生
マリー先生:
それには引数に環境変数名を指定してprintenvコマンドを実行すればいいわ。たとえば、「EDITOR」はデフォルトのエディターを示す環境変数だけど、その値を表示するには次のようにするの。

$ printenv EDITOR 【Enter】
vi

なお、通常のシェル変数と同じくechoコマンドでも値を表示できるけど、その場合変数名の前に「$」が必要な点に注意してね。

$ echo $EDITOR 【Enter】
vi

シェル変数を環境変数にする

通常のシェル変数を環境変数にするにはexportコマンドを使用します。

export 変数名

このことを「変数をエクスポートする」と言います。あるいは、次のようにすることで値の設定とエクスポートとを同時に行えます。

export 変数名=値

環境変数の名前は通常のシェル変数と区別するために、すべて大文字にするとよいでしょう。たとえば、変数「ENV1」を環境変数としてエクスポートするには次のようにします。

$ export ENV1="hello hp-ux"  ←変数「ENV1」をエクスポート
$ echo $ENV1  ←echoコマンドで確認

タックス君:
環境変数が子プロセスに引き継がれるっていう意味がよくわからないのですが……。
タックス君
マリー先生
マリー先生:
環境変数をエクスポートした後にシェルを起動して確認してみると、イメージがつかめると思うわよ。

$ export ENV1="hello hp-ux"  ←(1)
$ sh  ←(2)
$ printenv ENV1  【Enter】  ←(3) 
hello hp-ux
$ exit  ←シェルを終了

この例では、(1)で環境変数「ENV1」設定して、(2)で別のシェルを子プロセスとして起動しているの。(3)で子プロセスのほうのシェルでprintenvコマンドを実行すると値が表示されることから、環境変数が引き継がれているとわかるわけ。
同じことを通常のシェル変数でやってみると、子プロセスに引き継がれないことを確認できるわよ。

$ val1="hello unix"  ←通常の変数に値を設定
$ sh  ←シェルを起動
$ echo $val1  【Enter】
    ←なにも表示されない
$ exit  ←シェルを終了

環境設定ファイルの種類

環境変数などをシェルの環境設定ファイルに記述しておくと、ログイン時に自動的に読み込まれて毎回同じ設定でシェルを使用できます。POSIXシェルの主な環境設定ファイルは次の2つです。

~/.profile
/etc/profile

/etc/profileはすべてのユーザーに共通の環境設定を、ホームディレクトリに保存された「~/.profile」ではユーザーごとの環境設定を行います。
たとえば、初期状態の/etc/profileには次のような変数を設定する行があります。

PATH=/usr/bin:/usr/ccs/bin:/usr/contrib/bin:/usr/contrib/Q4/bin:/opt/perl/bin
MANPATH=/usr/share/man:/usr/contrib/man:/usr/local/man

どちらも環境変数ですが、最初の行はコマンド検索パスを、2番目の行はマニュアルの保存先を設定します。

「~/.profile」に設定を記述する

通常、ユーザーごとのエイリアスや環境設定は「~/.profile」に記述します。ただし、初期状態では「-r--r--r」(444)、つまり、すべてのユーザーに対してリードオンリーに設定されているため編集できません。

$ ls -l ~/.profile
-r--r--r--   1 o2         users          700 May 21  2008 .profile

そのため次のようにchmodコマンドを実行し、所有者に対して書き換えを許可した上で、viエディターなどで編集を行います。

$ chmod u+w ~/.profile

「~/.profile」の設定をテストする

「~/.profile」の設定をテストするには、いったんログアウトしてログインし直してもかまいませんが、「~/.profile」の設定を誤ると、ログインできないといった問題が起こる危険性があります。
そこで、通常はログインし直す代わりに、引数で指定したファイルからコマンドを読み込んで、現在のシェル環境で実行する「.(ピリオド)」コマンドを使用するとよいでしょう。

. ファイルのパス

「.」コマンドの引数に「~/.profile」を指定して実行すると、ファイル内に記述した環境変数などの動作を確かめることができます。たとえば、次のような環境変数「HP」の設定を「~/.profile」に加えたとしましょう。

export HP="hp-ux"

次のように「.」コマンドを実行することで、環境変数「HP」が正しく設定されたことが確認できます。

$ . ~/.profile
$ printenv HP 【Enter】
hp-ux  ←追加した環境変数の値が表示される

四色君:
「.」コマンドを使わないで、次のようにshコマンドの引数に環境設定ファイルのパスを指定してもいいのですか?

$ sh ~/.profile
四色君
マリー先生
マリー先生:
そうすると、子プロセスとしてシェルが起動するので、現在のシェルには環境変数などの設定が反映されないのでダメなの。あと、環境設定ファイルはシェルの種類によって異なるから注意してね。
タックス君:
シェルの種類によってファイル名が違うということですか?
タックス君
マリー先生
マリー先生:
そう。たとえばcshというシェルの場合には/etc/csh.loginと「~/.cshrc」、「~/.login」といったファイルが環境設定ファイルとして使用されるの。さらに、POSIXシェルとcshではエイリアスや変数の設定方法も異なるため、ファイルの中身の互換性もないので環境設定ファイルを共有することもできないわ。
もう1点、X Window SystemのCDE環境を使用している場合には、「~/.dtprofile」という環境設定ファイルが使用されるので、これも注意してね。
四色君:
「~/.profile」は読み込まれないのですか?
四色君
マリー先生
マリー先生:
そう。もし「~/.profile」を自分でカスタマイズしたりしていて、その設定をCDE環境の端末などにも反映させたければ「~/.dtprofile」の最後を次のように変更する必要があるの。

# DTSOURCEPROFILE=true
↓書き換える
 DTSOURCEPROFILE=true

「#」はその行がコメントであることを表しているの。「#」を削除することにより、 DTSOURCEPROFILEという変数が「true」に設定され、「~/.profile」が読み込まれるようになるわけね。


練習問題

第1問:「cp -r」コマンドのエイリアスとして「cpDir」を定義するコマンドはどれか?

a) alias cpDir=cp -r
b) alias cpDir='cp -r'
c) cpDir="cp -r"
d) alias cpDir "cp -r"
正解はこちら
b) alias cpDir='cp -r'
スペースを含むコマンドのエイリアスを定義するにはクォーティングする必要がある。

第2問:エイリアス「cpDir」を削除するコマンドはどれか?

a) unalias cpDir
b) alias -d cpDir
c) delete cpDir
d) cpDir=""
正解はこちら
a) unalias cpDir
エイリアスを削除するにはunaliasコマンドを使用する。

第3問:変数「MYENV」に値として「SAMPLE」を代入し環境変数にするコマンドはどれか?

a) MYENV="SAMPLE"
b) export MYENV="SAMPLE"
c) export $MYENV="SAMPLE"
d) env MYENV="SAMPLE"
正解はこちら
b) export MYENV="SAMPLE"
変数を環境変数にするにはexportコマンドでエクスポートする。

第4問:環境設定ファイル「~/.profile」の動作を確かめるコマンドはどれか?

a) sh ~/.profile
b) ~/.profile
c) exec ~/.profile
d) . ~/.profile
正解はこちら
d) . ~/.profile
環境設定ファイルのようなコマンドファイルを現在のシェル環境で実行するにはピリオド「.」コマンドを使用する。

連載記事一覧 戻る 1  |  2

教科書シリーズ 「UNIXの教科書」 「HAクラスターの教科書」 連載記事一覧

UNIXの教科書「基礎編」

第1日目:ログインしてコマンドを実行してみる
第2日目:ディレクトリやファイルを操作してみる
第3日目:シェルの基本を知る
第4日目:ファイルの基本操作
第5日目:viエディタの操作(基本編)
第6日目:リダイレクションとパイプを活用する
期末試験

UNIXの教科書「応用編」

第1日目:grepコマンドと正規表現
第2日目:ファイルの検索
第3日目:viエディタの操作(活用編)
第4日目:ファイルの圧縮とアーカイブ
第5日目:ジョブとプロセスの操作
第6日目:シェルの環境設定
第7日目:シェルスクリプトでより便利に
期末試験

UNIXの教科書「運用編」

第1日目:ユーザーの管理
第2日目:ファイルの安全管理(その1)
第3日目:ファイルの安全管理(その2)
第4日目:ネットワークの基本を理解する
第5日目:ネットワーク関連のコマンド
第6日目:システム情報の表示
期末試験 New!

HAクラスターの教科書

第1日目:ハードウェア構成を知る
第2日目:ネットワークを設定する
第3日目:共有ディスクを構成する
第4日目:HAクラスターを構成する
第5日目:パッケージを構成する
第6日目:障害テストを実施する
期末試験

 その他の連載記事


本ページの内容は執筆時の情報に基づいており、異なる場合があります。

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

HPEサポートセンター
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項