シェル変数、環境変数、ヒストリ

					2012年06月15日
情報科学類 コンピュータリテラシ

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2012/2012-06-15
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■連絡事項

■シェル変数と環境変数

■変数とは

変数(variable)
何かを覚えるためのもの。メモリを抽象化して名前をつけたもの。
変数名(variable name)
変数を区別するための名前
変数の値(value)
変数が覚えているもの
変数の値を参照(reference)
変数の値を取り出すこと
変数に値を代入(assignment)
変数名で変数を指定して、その値を変更する。変数に値をセットする。

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

シェルでは、2種類の変数を使える。
シェル変数
1つのシェル内でのみ有効。
環境変数
実行されるプログラム(子プロセス)に引き継がれる。

◆シェル変数の操作

シェル変数へ代入するには、「変数名=」を使う。
$ X=100 [←]
$ []
参照するには、「$変数名」とする。
$ X=100 [←]
$ echo $X [←]
100
$ []
他の変数と紛らわしい時には、 「"$変数名"」のようにダブルクォートで括るとよい。
$ echo x"$X"x [←]
x100x
$ []
(注意: $Xx と $X は別の変数なので区別できるようにする。) あるいは、${変数名}のように、 括弧で括る方法もある。
$ echo x${X}x [←]
x100x
$ []

シェル変数を削除するには、unset コマンドを使う。

$ unset X [←]
$ echo $X [←]

$ echo x"$X"x [←]
xx
$ []
設定されていないシェル変数を使おうとすると、空として扱われる。 注意:シェルのプロンプト($ ) と間違えないこと。シェルのプロンプ ト($ ) は、実際のコンピュータでは、cosmos38:~ i1012345$ のようになっている。

◆環境変数の代入

bash では、シェル変数の変数名を export コマンドに与えることで、 そのシェル変数を環境変数に変える。
$ X=100 [←]
...
$ export X [←]
$ []
あるいは、最初から export を付けて代入の操作をすることもできる。
$ export X=100 [←]
$ []
bash では、環境変数の参照方法と削除方法はシェル変数と同じ($とunset)である。

◆環境変数の利用方法

シェルがプログラムを実行する時、シェル変数は、プログラムへ引き渡されな いが、環境変数は、渡される。環境変数は、プログラムの動作を変更するため に用いる。 以下の例では、環境変数 TZ を設定して、date コマンドの動きを 変えている。
$ date [←]
2012年 6月13日 水曜日 16時26分16秒 JST
$ echo $TZ [←]

$ TZ=EST [←]
$ export TZ [←]
$ echo $TZ [←]
EST
$ date [←]
2012年 6月13日 水曜日 02時26分32秒 EST
$ []
マニュアルの ENVIRONMENT に記述されている。
% man date [←]
DATE(1)                   BSD General Commands Manual                  DATE(1)

NAME
     date -- display or set date and time

SYNOPSIS
     date [-ju] [-r seconds] [-v [+|-]val[ymwdHMS]] ... [+output_fmt]
     date [-jnu] [[[mm]dd]HH]MM[[cc]yy][.ss]
     date [-jnu] -f input_fmt new_date [+output_fmt]
     date [-d dst] [-t minutes_west]

DESCRIPTION
     When invoked without arguments, the date utility displays the current
     date and time.  Otherwise, depending on the options specified, date will
     set the date and time or print it in a user-defined way.
...
ENVIRONMENT
     The following environment variables affect the execution of date:

     TZ      The timezone to use when displaying dates.  The normal format is
             a pathname relative to /usr/share/zoneinfo.  For example, the
             command ``TZ=America/Los_Angeles date'' displays the current time
             in California.  See environ(7) for more information.

...

◆空白を含むシェル変数

シェル変数や環境変数で、空白を含んでいる(可能性がある)時には、ダブル クォート "" で括ると1単語として扱われる。
$ as="Application Support" [←]
$ echo $as [←]
Application Support
$ ls -ld ~/Library/$as [←]
ls: /home/prof/yas/Library/Application: No such file or directory
ls: Support: No such file or directory
$ ls -ld ~/Library/"$as" [←]
drwx------  14 yas  prof  4096  4 26 12:27 /home/prof/yas/Library/Application Support
$ []

◆メタキャラクタ

シェルが解釈し、コマンドには渡されない文字。 < > | $ { } ( ) [ ] & ; ^ " * ? ~ ' ` 空白 タブ など。

コマンドの引数として渡したい時には、解釈を避ける(エスケープ(escape))た めの特殊な形式を使う。
形式 エスケープ対象 エスケープしないメタキャラクタ
\x \」の直後の一文字 なし (行末の「\」は継続行の意味)
'str' 「'」でくくられた文字列 「'」自身は入れられない。「\'」も効かない。
"str" 「"」でくくられた文字列 「$」, 「`」(バッククォート),「"」(ダブルクォート), 「\」,「!」
\は、ASCII 5c(16進)の文字。表示は、「\」か「¥」。

ダブルクォート "" の内部では、$ は解釈され、シェル変数や 環境変数の置き換えられる。シングルクォート 「''」では、$ は解釈さない。

$ echo "$HOME" [←]
/home/prof/yas
$ echo '$HOME' [←]
$HOME
$ []

◆空白のエスケープ

ファイル名の一部に空白を含む場合、エスケープする必要がある。
$ ls -ld "/Applications/QuickTime Player.app" [←]
drwxr-xr-x  3 root  wheel  102  3 28 09:11 /Applications/QuickTime Player.app
$ open "/Applications/QuickTime Player.app" [←]
$ []
バックスラッシュを使ってもよい。
$ ls -ld /Applications/QuickTime\ Player.app [←]
drwxr-xr-x  3 root  wheel  102  3 28 09:11 /Applications/QuickTime Player.app
$ open /Applications/QuickTime\ Player.app [←]
$ []
bashのファイル名補完機能 では、空白を含むファイル名は、バックスラッシュで自動的に補完されることがある。
$ ls -ld /A[]
$ ls -ld /A[tab][]
$ ls -ld /Applications/[]
$ ls -ld /Applications/Q[tab][]
$ ls -ld /Applications/Q[tab][]
$ ls -ld /Applications/QuickTime\ []
$ ls -ld /Applications/QuickTime\ P[tab][]
$ ls -ld /Applications/QuickTime\ Player.app/[]
ファイル名の補完機能を使う時には、空白を打ち込むには、 「\ バックスラッシュ スペース」と打つ必要がある。

補完よりも、ファイル名の置き換え機能が簡単のこともある。
$ ls -ld /A*/Q*P* [←]
drwxr-xr-x  3 root  wheel  102  3 28 09:11 /Applications/QuickTime Player.app
$ []

◆環境変数PATH

環境変数PATHは、コマンドが存在するディレクトリを保持している環境変数である。
$ echo $PATH [←]
/home/prof/yas/bin:/usr/local3/coins/macosx/bin:/usr/local3/coins/common/bin:/De
veloper/Simulator/GTKwave/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/
local3/bin:/opt/local/bin:/usr/X11/bin
$ printenv PATH [←]
/home/prof/yas/bin:/usr/local3/coins/macosx/bin:/usr/local3/coins/common/bin:/De
veloper/Simulator/GTKwave/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/
local3/bin:/opt/local/bin:/usr/X11/bin
$ []
シェルは、打ち込まれたコマンドを環境変数 PATH の中から探して実行する。 たとえば、ls と打ち込まれると、/bin にある /bin/ls を実行する。

複数のコマンドがみつかれば、PATHの先に見つかったものを実行する。 どのコマンドが実行されるかを確認するには、which コマンドを使う。

$ which ls [←]
/bin/ls
$ []

■コマンド行の編集機能とヒストリ機能

◆historyコマンド

history コマンドは、過去に打ち込んだコマンドの一覧を表示するコマンドである。
$ history [←]
    1  saykotoeri2 
    2  saykotoeri2 
    3  fg
    4  dup
<中略>
  500  history
$ []
シェル変数 HISTFILESIZE の個数だけ記憶している。
$ echo $HISTFILESIZE [←]
500
$ []

◆bashのコマンド行の編集機能

bash には、Emacs に似せて、コマンド行の編集機能がある。

◆「!」と「^」

bash には、過去に打ち込んだコマンドを記憶して再現する機能がある。 bash では、コマンド行の編集機能があるので使わなくてもよいが、次の ことは理解しておく必要がある。

◆利用

bash では、 コマンド行の編集機能 で、ヒストリをさかのぼって編集して利用できる。 その他に、次のような方法もある。bash では、ほとんど使われない。 編集機能がないシェルでは有効であった。
!!
直前のコマンドの再実行
!10
history で表示される 10番のコマンドの実行
!-2
現在からさかのぼって2個前のコマンドの実行。!-1 は、!! と同じ。
!str
先頭が str から始まるコマンドで、最も最新のもの。
!?str
文字列 str を含むコマンドで、最も最新のもの。
^old^new
直前のコマンドの old を new で置き換えたもの。打ち間違いの修正。
!*
直前のコマンドの引数(コマンド名以外)
利用例:
$ ls file.txt [←]
file.txt
         ここで -l を付けわすれたのに気がつく
$ ls -l !* [←]
ls -l file.txt
-rw-r--r--  1 yas  prof  9  4 29 21:23 file.txt
$ []

■Emacs

◆Emacs fill-paragraph (Esc q, M-q)

Emacs には、1行の長さをそろえる機能がある。たとえば、次のように乱れたものを
M-q runs the command fill-paragraph 
which is an interactive compiled
Lisp
function
in `textmodes/fill'.
It is bound to M-q.
M-q または Esc q で、標準で 70 以内になるように次のように整える。
M-q runs the command fill-paragraph which is an interactive compiled
Lisp function in `textmodes/fill'.  It is bound to M-q.
整える範囲は、上下に空行で区切られた範囲である。長過ぎる行は、改行が入 れられる。英単語の場合には、途中で改行することはない。日本語の場合には、 標準では、35文字で改行される。

fill-paragraph で、折り返す文字数を変えたい場合には、set-fill-column を 使う。

■実習

実習時間中には、 以下の課題をできるだけ多く行いなさい。全部を行う必要はない。

★練習問題(1701) printenvコマンド

printenvtコマンドに引数付けないで実行すると、全ての環境変数の値が表示さ れる。これを確認しなさい。
$ printenv [←]

★練習問題(1702) 環境変数の確認

個々の環境変数の値がどうなっているか、echo コマンドや printenv コマンド で確認することができる。
$ echo $HOME [←]
/home/prof/yas
$ printenv HOME [←]
/home/prof/yas
$ []
注意: printenv の引数には、$ を付けない。

次のような環境変数の値を調べなさい。

注意:環境変数が設定されていないことがある。

★練習問題(1703) 環境変数 TZ の動作

次のようなコマンドを打ち、環境変数 TZ の働きを調べなさい。
$ date [←]
$ echo $TZ [←]
$ export TZ=EST    [←]
$ date [←]
$ unset TZ [←]
$ date [←]
$ []
環境変数 TZ/usr/share/zoneinfo/ の下にあるファイル名 を設定して、その動作を確認しなさい。

★練習問題(1704) 環境変数 HOME

環境変数 HOME の値を調べなさい。
$ echo $HOME [←]
cd コマンドの引数に与えて、ホーム・ディレクトリや ホーム・ディレクトリ以下のディレクトリに移動してみなさい。
$ cd / [←]
$ cd $HOME [←]
$ cd / [←]
$ cd $HOME/Desktop [←]
$ []
ファイル名の置き換え機能「~/」を使う方法と環境変数 HOME を使う方法を比 較しなさい。

★練習問題(1705) 環境変数 PATH

環境変数 PATH の働きを次のようにして調べなさい。
$ echo $PATH [←]
(表示を確認する)
$ aaaa [←]
-bash: aaaa: command not found     (エラーの表示)
$ ls [←]
(普通に実行される)
$ which ls [←]
/bin/ls
$ PATH=/usr/bin [←]
$ ls [←]
-bash: ls: command not found     (エラーの表示)
$ exit [←]
この例ではPATH の内容がかなり限定され、普段は実行できるコマンドが実行で きなくなっている。それで、最後に exit コマンドでシェルを終了している。 シェルが必要ならば、もう一度 iTerm を実行するなどしてシェルを実行する。

★練習問題(1706) シェル変数 HISTFILESIZE

シェル変数 HISTFILESIZE の値を調べなさい。
$ echo $HISTFILESIZE [←]
history コマンドで表示されるコマンドの数を調べなさい。
$ history [←]
<表示>
$ history | wc [←]
$ []
wc は、word count の略で、行数、単語数、バイト数を表示する。一番左が行 数である。 シェル変数 HISTFILESIZE の値を変化させると、何が起きるか調べなさい。

★練習問題(1707) シェル変数 PS1

シェル変数 PS1 を表示しなさい。
cosmos38:~ yas$ echo "$PS1"
\h:\W \u\$ 
cosmos38:~ yas$ 
この時、ダブルクォート "" を付けないとうまく表示できないことがある。この理由を考えなさい。 シェル変数 PS1 は、シェルのプロンプトを保持している。これを変更してみな さい。
cosmos38:~ yas$ PS1="hi$ "[←]
hi$ []

マニュアル man bash で、PS1 変数(PROMPTING)の中で次のような表現がどのような意味を 持っているかを調べなさい。

man bash の中では、ページャ lv (less) の 「/」 による検索が便利である。

★練習問題(1708) シェル変数の確認

setコマンドに引数付けないで実行すると、全てのシェル変数(環境変数含む)の 値が表示される。
$ set [←]
どのようなシェル変数が設定されているか観察しなさい。

★練習問題(1709) シェル変数の操作

シェル変数を使って、長いファイル名やディレクトリ名を簡単に打ちなさい。
$ u=/Applications/Utilities [←]
$ echo $u [←]
/Applications/Utilities
$ ls $u [←]
Activity Monitor.app            Grapher.app
Adobe Utilities.localized       Java Preferences.app
AirPort Utility.app             Keychain Access.app
AppleScript Editor.app          Migration Assistant.app
Audio MIDI Setup.app            Network Utility.app
Bluetooth File Exchange.app     Podcast Capture.app
Boot Camp Assistant.app         RAID Utility.app
ColorSync Utility.app           Remote Install Mac OS X.app
Console.app                     Spaces.app
DigitalColor Meter.app          System Profiler.app
Disk Utility.app                Terminal.app
Expose.app                      VoiceOver Utility.app
Grab.app                        X11.app
$ []

★練習問題(1710) クォートの働き

bash で ダブルクォート「" "」 や シングルクォート 「' '」の働きを調べなさい。
$ echo "$HOME" [←]
(表示の確認)
$ echo '$HOME' [←]
(表示の確認)
ダブルクォート「" "」 や シングルクォート 「' '」は、中に改行を含めることができる。逆に言うと、必ず閉じる 必要がある。閉じられていない場合には、シェルのプロンプトが$ から > に変化する。このことを確認しなさい。
$ echo "a [←]
> b[←]
> c"[←]
(表示の確認)
$ echo 'a [←]
> b[←]
> c'[←]
(表示の確認)
$ []

★練習問題(1711) historyコマンド

history コマンドで、どのようなコマンドを打ち込んできたかを調べなさい。
$ history [←]
$ history | tail -5 [←]
(過去の5行だけ表示)
$ history | grep cd [←]
(cd を含む行だけ表示)
$ history | lv [←]
(ページャ lv でページ単位で表示。)

★練習問題(1712) historyを使ったコマンドの実行

history の結果を用いて、過去のコマンドを再実行してみないさい。

★練習問題(1713) Emacs fill-paragraph (Esc q, M-q)

Emacs の fill-paragraph 機能 (Esc q, M-q) を使ってみなさい。
  1. emacs を実行する。
  2. Emacs fill-paragraphの説明 で用いたように、1行の長さがばらばらのパラグラフを用意する。パラグラフと は、空行で区切られたテキストの塊である。パラグラフの前後には、空行を入 れる。パラグラフには日本語を含めてもよい。
  3. パラグラフの中にカーソルを移動する。
  4. M-q または Esc q と打つ。

★練習問題(1714) Emacs set-fill-column

fill-paragraph で、折り返す文字数を変えたい場合には、set-fill-column を 使う。
C-u  C-x f
あるいは、折り返したい位置にカーソルを移動してから次のように打つ。
C-x f
以後、M-q または Esc q で折り返しを行った時には、指定 した文字数で折り返される。この機能を確認しなさい。

■課題17 シェル変数、環境変数、ヒストリ

以下の問題について、問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。端末の表示 (コマンドの実行結果)は、コピー&ペースト等の機能を使って提出するファイ ルに含めなさい。課題が達成されたことを示す程度には見やすいように編集し なさい。ただし、過度の編集は避けなさい。編集した部分は必要に応じて省略 記号を入れなさい。

テキスト・ファイルで、右揃えをするには、パラグラフの区切りを、空行にし た上で、M-q (Esc q, M-x fill-paragraph) の機 能を利用するとよい。

(1) 次のファイル名(ディレクトリ名も含めたすべて)を、適当なシェル変数を 設定して短く表現しなさい。

    /Applications/Firefox.app
    /Applications/Thunderbird.app
    /Applications/QuickTime Player.app
短く表現したものを、ls -ld コマンドの引数に与えて実行しなさい。
$ シェル変数の代入1 [←]
$ シェル変数の代入2 [←]
$ シェル変数の代入3 [←]
...
$ シェル変数の代入n [←]
$ ls -ld シェル変数の参照を利用短い表現 [←]
drwxr-xr-x@ 3 mac-admin  admin  102  1 16 09:29 /Applications/Firefox.app
$ ls -ld シェル変数の参照を利用短い表現 [←]
drwxr-xr-x@ 3 mac-admin  admin  102  1 12 11:10 /Applications/Thunderbird.app
$ ls -ld シェル変数の参照を利用短い表現 [←]
drwxr-xr-x  3 root  wheel  102  5 21  2009 /Applications/QuickTime Player.app
$ []
ヒント1: シェル変数への代入は、1回でもよい。

ヒント2: シェル変数の値に空白が含まれている(可能性がある)ものを参照する 時には、ダブルクォートでくくる("$name")とよい。

ヒント3: 補完機能と組み合わせてもよい。その場合にはどのようなキー操作を したのかをレポートに書きなさい。

(2) echo コマンドを使って、次の文字列を画面に表示しなさい。

たとえば、次のように回答しなさい。
$ echo 回答内容 [←]
Lib*
$ []
注意:これは、メタキャラクタをエスケープする課題である。単に echo コマ ンドに対してこのような文字列を与えればよいということでない。

(2) 共通科目情報処理の 情報処理実習用手引き の次の章を読みなさい。

次の項目について簡単に説明しなさい。

(3) 筑波大学における情報システム利用のガイドライン 、 および、 用語集 を読みなさい。 そして、疑問に思ったこと、または、改善すべきと思ったことを3項目以上示し なさい。この時、次のような情報を含めなさい。

(4) [加点] 以下のコマンドは、環境変数によって動作が変わる。どのような環 境変数でどのように動作が変わるかを man コマンドや The Unix Super Text (30.4.2 節、その他各コマンドの説明) で調べなさい。そして 練習問題(1705) と同様に実際に実行し、動作の 変化を確かめなさい。 全体として、コマンドと環境変数の組で、3 個以上の例を示しなさい。ただし、 環境変数としては PATH, TZ 以外のものを使いなさい。同じ環境変数で、複数 のコマンドの動作が変化するものを含めてもよい。

(5) [加点] bash hisory を利用する方法(!,^など) とコマンド行の編 集機能を比較して、前者が有効である場合を2つ示しなさい。実際に実行して結 果の一部を含めなさい。


Last updated: 2012/06/15 11:25:30
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>