授業資料/04 の変更点


#contents

//  第 4 回 -- 標準入出力 および シェル環境のカスタマイズ

* Introduction: 標準入出力, リダイレクション,パイプ [#f74469ce]

unix の重要なポリシーの一つに
&br;&br;
CENTER:&size(24){''短い単純なプログラムを組み合わせて複雑な動作を行なう''};
&br;&br;

というものがある.
そのための仕組みの一つが,標準入出力とその制御であるリダイレクション,パイプラインである.
&br;
&br;
まず少し基本的な話をすると,unix では通常のプログラムは
「標準入力」「標準出力」「標準エラー出力」という特別な入出力先を持っている.
&br;
そしてこの「標準入出力」が繋がる相手をユーザーが自由に制御することができ,
その方法が「リダイレクション」や「パイプライン」なのである.
&br;
&br;

CENTER:■ 標準入出力とその制御(リダイレクション,パイプ)の様子 ■
&br;
&ref(./stdinout.png);

&br;&br;
上図のように,プログラムの入出力先を''「プログラムの実行時にユーザが勝手に変えられる」''のである.
上で述べたポリシーにより ''「unix には単機能プログラムが たくさんある」'' ため,この機能と組み合わせると
&br;&br;
CENTER:&size(24){''まるでプログラミングをしたかのような,かなり自由なことが''};
&br;
CENTER:&size(24){''プログラミング不要で簡単に実現できる''};

&br;&br;
という「おいしい」状況が unix に出現する.
これは本当に便利なので,ぜひ習得しよう.

&br;&br;
* Standard Input/Output: 標準入出力とは何か [#r1ab79f9]

unix ではプログラムはチャネル,もしくは デスクリプタ(ファイル記述子)
とよばれる出入り口ファイルを用いてデータの入出力を行なう.
機器や環境に依存しない汎用入出力を可能とする目的で,
unix ではこのうちの最初の 3つ(0 〜 2番)のデスクリプタを特別なものとして決めている.
これらが標準入出力とよばれるものであり,次のような性質を持っている.

: 標準入力(stdin) |
プログラムが汎用データ入力に使う.
指定していない場合,デフォルト値(通常は端末キーボード)が用いられる.
: 標準出力(stdout) |
プログラムが汎用データ出力に使う.
指定していない場合,デフォルト値(通常は端末ディスプレイ)が用いられる.
: 標準エラー出力(stderr) |
プログラムがエラーメッセージの汎用出力に使う.
指定していない場合,デフォルト値(通常は端末ディスプレイ)が用いられる.

これら標準入出力によるデータの入出力の相手はプログラムを起動したシェルが決める約束になっている.
&br; 
&br; 
&ref(/materials/warning.png); 何も指定しないとき(デフォルト)は,
&br;
''
(入力)キーボード → プログラム → (出力)ディスプレイ
''
&br;
と繋がっている.


* Redirection: リダイレクション [#x8f8cd33]

&br;
CENTER:&size(24){''標準入出力先を何にするかはユーザーが簡単に変更できる''};
&br;
&br;

これを上手に使えば,同じプログラムの出力をファイルへ出力したり,ディスプレイへ出力したり,
出力させなかったりと変更することを「プログラム側で全く考慮する事なく」
行なうことができる.
&br; 
&br; 
この「標準入出力先を変更すること」,すなわち標準入出力の制御を,(I/O)リダイレクションとよぶ.
&br; 
&br; 
そこで,以下に「一つのプログラムに対する」具体的なリダイレクションの方法を示そう.
&br; 
&ref(/materials/warning.png); 二つのプログラムの入出力を直接繋げてしまう「同時リダイレクション」は特別に「パイプライン」と呼ばれる. 詳しくは後述する.
&br; 
&br; 
文法がシェルによってわずかに異なるため,以下に sh 系と csh 系とにわけて示しておく.
&br; 
(多くの学生は,たぶん bash を使っているだろうから,とりあえず sh 系の方だけをみておけばよいだろう)
&br; 
&br; 
&br; 
多すぎて良く分からないという場合は,
&color(red){''赤字''};
で書かれている3ヶ所を理解して覚えるだけでも十分だろう.

** How to use the redirection: リダイレクションのやり方… コマンド名の後ろに以下の「おまじない」をつければよい [#d41c6e58]

: 入力の変更 |
| sh 系 | csh 系 | 意味 |h
|>|CENTER: ''<␣hoge'' | &color(red){''標準入力を hoge というファイルに変更.''}; |
|>| ''<<␣hoge &br; 内容行1 &br; 内容行2 &br; … &br; 内容行最後 &br; hoge'' | 標準入力を最初の ''hoge'' から次の ''hoge'' までの内容に変更.&br;"Here Document" 機能とよばれる((なぜかは知らないが,多くの解説書等ではこの Here-Document 機能に触れていないことが多い)).  |
&br;
&br;
: 標準出力の変更 |
| sh 系 | csh 系 | 意味 |h
|>|CENTER: ''>␣hoge'' | &color(red){''標準出力を hoge というファイルに変更.''}; &br; ''hoge'' というファイルが存在しなければ作成され,&br; ''既に存在するならば内容は消去されて上書きされてしまう.'' &br; csh 系および新しめの sh系で noclobber 変数をセットしてあるときは,&br;既に ''hoge'' が存在するならばエラーになる. &br; (大切なファイルに上書きして内容を失わないための機能) |
| ''>¦␣hoge'' | ''>!␣hoge'' | (noclobber 変数を無視して) 標準出力を ''hoge'' というファイルに変更.&br;noclobber 変数をセットしてあっても無視して強制的に上書きする. |
|>|CENTER: ''>>␣hoge'' | &color(red){''標準出力の出力を hoge というファイルの末尾に追加していく.''}; &br; ''hoge'' が存在しなければ作成される. &br; ただし,csh 系で noclobber 変数をセットしてあるときは,''hoge'' が&br;存在しなければエラーになる. |
|BGCOLOR(white):| ''>>!␣hoge'' | (noclobber 変数を無視して) 標準出力の出力を ''hoge'' というファイルの末尾に追加していく. |
&br;
&br;
: 標準エラー出力も変更 |
| sh 系 | csh 系 | 意味 |h
| ''2>␣hoge'' |BGCOLOR(white):| 標準エラー出力を ''hoge'' というファイルに変更. &br; ファイルの存在, noclobber 変数との関係は上記同様. |
|BGCOLOR(white):| ''(''コマンド''␣>␣hoge )␣>&␣boke'' | 標準出力を ''hoge'' というファイルに, 標準エラー出力を ''boke'' というファイルに各々変更. &br; (標準エラー出力だけを変更することはできない) &br; ファイルの存在, noclobber 変数との関係は上記同様. |
| ''>␣hoge␣2>&1'' | ''>&␣hoge'' | 標準出力と標準エラー出力の出力を両方とも ''hoge'' というファイルに変更. &br; ファイルの存在, noclobber 変数との関係は上記同様. |
| ''>¦␣hoge␣2>&1'' | ''>&!␣hoge'' | (noclobber 変数を無視して) 標準出力と標準エラー出力の出力両方とも ''hoge'' というファイルに変更. &br; noclobber 変数をセットしてあっても無視して強制的に上書きする. |
| ''>>␣hoge␣2>&1'' | ''>>&␣hoge'' | 標準出力と標準エラー出力の出力の両方を ''hoge'' というファイルの末尾に追加していく. &br;ファイルの存在, noclobber 変数との関係は上記同様. |
|BGCOLOR(white):|  ''>>&!␣hoge'' | (noclobber 変数を無視して) 標準出力と標準エラー出力の出力両方とも ''hoge'' というファイルの末尾に追加していく. |

&br;&br;
&ref(/materials/Gnome-Preferences.png); リダイレクションの実例

例えば,
''ls␣-lg''
の結果をゆっくり調べたいとしよう.
これは出力結果をファイルにしておいてから,じっくり調べるのが良い.
具体的には,
&br; &br;
> ''ls␣-lg␣>␣sample-file''

&color(,#afff7e){↑ ls コマンドの出力先を,sample-file というファイルにリダイレクトしている};
&br; &br;
とすれば,
''sample-file''
という名前のファイルに
''ls␣-lg'' 
の結果が収められる.
だから,例えば less コマンドを使って
''less␣sample-file''
とすると

  合計 9756
  -rw-r--r--    1 ot-026fd others          0 May 11 14:32 #.xemacs#
  -rw-r--r--    1 ot-026fd others         36 May 11 14:34 #test.txt#
  drwx--s--x   23 ot-026fd others       2048 May 29 20:52 ./
  drwxr-sr-x   43 root     sys          1024 Apr  8 18:54 ../
  -rw-r--r--    1 ot-026fd others          0 May 11 08:47 .Change2tcsh
  -rw-------    1 ot-026fd others        505 May 28 16:14 .ICEauthority
  drwxr-sr-x    3 ot-026fd others        512 May 24 13:57 .Mathematica/
  -rw-r--r--    1 ot-026fd others      23158 Apr 15 22:56 .RealNetworks_RealMediaSDK_60
  -rw-r--r--    1 ot-026fd others        485 Apr 15 22:56 .RealNetworks_RealPlayer_60
  -rw-r--r--    1 ot-026fd others         92 Apr 15 22:56 .RealNetworks_RealShared_00
  drwxr-sr-x    3 ot-026fd others        512 May  8 14:53 .Wnn6/
  …略…


というように,中身をいつでも繰り返しゆっくり見ることができる.
&br;
&br;
さらに,ここにあるファイルをサイズ順にリストアップしてみたいな〜 
と思ったとしよう.
&br;
すると,sort コマンド(中身を並べる)を使って,
''sample-file''
の中身の,''この場合は'' 5 番目の要素を大きい順に並べればよい.
&br;
&ref(/materials/warning.png); ''ls␣-lg'' コマンドの結果の何番目にファイルサイズが表示されるかは環境に依存するので,自分で数えてから実行しよう.

このケースでは,入力と出力の両方をリダイレクションすれば便利だ. 
だから例えば以下のようにすればよい.
&br; &br;
> ''sort␣-k␣5␣-nr␣<␣sample-file␣>␣sample-file2''

&color(,#afff7e){↑ sort コマンドの入力先を sample-file に,出力先を sample-file2 にリダイレクトしている};
&br; &br;
こうすれば,
''sample-file2''
に望みの結果が入っている.


&br;&br;
&ref(/materials/notes.png); 実習

+ 上に示した実例と同じ作業をやってみる.
+ さらに,同様の方法で,
二つのディレクトリの中でサイズの大きな方から順に5つのファイルをリストアップするにはどうしたらよいか考えよ.
そして実際に試してみよ.

** Tips of redirection: 覚えておくと便利なリダイレクト先 ''/dev/null'' [#h6ff7c16]

上の表を見ても分かるように,リダイレクト先には通常はファイルを指定する.
&br;
この時,unix に存在する特別なファイル
''/dev/null''
が非常に便利に使えるので覚えておこう.
&br;
&br;
このファイルは「ブラックホールファイル」とでも言うべき次の性質を持っている.

- 標準入力先に指定すると,「何も出てこない」
- 標準出力先に指定すると,「全て飲み込んで,何も変化しない」

よって,この性質を使って次のようなことができる.

: (空っぽの)新しいファイルを作れる. |
''cp␣/dev/null''␣ファイル名
&br;&br;
とすると,新しく(空っぽの)ファイルが作られる.
&br;
新しくファイルを作成する方法としては,他に
''touch'' ファイル名
とするという方法がよく知られている.
&br;
&ref(/materials/warning.png); ファイルを作るには他にも様々なひねくれた方法が考えられる. いろいろ考えてみよ.
&br;&br;
: とっておく必要のない出力を捨てることができる(しかも素早く)  |
例えば,
&br;
&br;
コマンド␣''>␣/dev/null␣ 2>&1'' 
    
… sh 系の場合
&br;
&br;
コマンド␣''>&␣/dev/null'' 
    
… csh 系の場合
&br;
&br;
とすれば,
標準出力と標準エラー出力の両方がブラックホールへと消えていくことになる.
&br;
そんなことをしたくなる場面があるのか? と思うかもしれないが,
これがあるのだ.
例えば,
ジョブをバックグラウンドで実行させていて,その出力が邪魔な時や,
コマンドを nohup で実行させる場合,
プログラムの計算速度などを純粋に測定するためにデータの出力に時間がかかると困る時,などがそれにあたる.
&br;
&br;
他にも,デバッグ情報などを常にエラー出力に出すことにしておいて,
不要なときはエラー出力先を 
''/dev/null'' 
にしておく,という使い方もできる.

* Pipe: パイプ [#ne4e3fb6]

原理的には,リダイレクションを使えば
&br;&br;
''[ファイルを媒介したプログラムの接続]''&br;
CENTER:Program A →(出力)→ ファイル →(入力)→ Program B

&br;&br;
として複数のプログラムの入出力をファイルを媒介して繋げられる.
''しかし'',繋げるだけならばファイルを明示的に指定するのは無駄なうえ,間違いのもとでもある.
&br;
&br;
そこで,
Program A の標準出力と Program B の標準入力を直接繋いでしまう方法が 
unix には用意されている.
&br;
この同時リダイレクションとでもよぶべき方法は,
「パイプ」もしくは「パイプライン」と呼ばれ,次のように使う.

■ パイプの使い方 ■
|CENTER: sh 系 |CENTER: csh 系 |CENTER: 意味 |h
|>|CENTER: Program A ␣''¦''␣ Program B | Program A の標準出力を Program B の標準入力として渡す. |
| Program A␣''2>&1''␣''¦''␣Program B | Program A ␣''¦&''␣ Program B | Program A の標準出力と標準エラー出力を Program B の標準入力として渡す. |

&ref(/materials/warning.png); パイプは好きなだけ何段にも重ねることができる!!
&br;
&br;

&ref(/materials/Gnome-Preferences.png); パイプの実例

例えば,
''ps␣axu''
の結果を画面で見るとしよう.
そのままこのコマンドを実行すると,
大量のデータが出力されて画面上を流れていってしまうのは経験しているだろう.
こういうときは,less コマンドなどを用いて,一画面ずつ表示させるのが定石である.
それには
&br; &br;
> ''ps␣axu␣|␣less''

&color(,#afff7e){↑ ps コマンドの出力と less コマンドの入力を直接パイプで繋いでいる};
&br; &br;
とすればよい.
&br;
さらに,この結果をプロセスの名前順に並べ直すことによって見易くしたいな〜
と思ったとしよう.
すると,sort コマンドを使って,上の結果を並べ直せば良い.
それにはどうするかというと,パイプを二回使って,
&br; &br;
> ''ps␣axu␣|␣sort␣-k␣11␣|␣less''

&color(,#afff7e){↑ ps コマンドの出力と sort コマンドの入力をパイプで繋ぎ,さらに sort コマンドの出力と less コマンドの入力をパイプで繋いでいる(パイプを二段使っている) };
&br;
&ref(/materials/warning.png); ''ps'' コマンドの結果の何番目にプロセス名が表示されるかも環境に依存する.自分で数えてから実行しよう.
&br; &br;
とすれば,

  sb8015th  8377  0.0  2.8 16700 3660 ?        S       20:38   0:00 (dns helper)
  ot-026fd  8540  0.0  1.0  2384 1380 pts/0    S       21:04   0:00 -csh
  ot-026fd  8559  0.0  1.0  2384 1380 pts/0    R       21:19   0:00 -csh
  ot-026fd  8427  0.0  0.9  1900 1164 pts/0    S       20:48   0:00 -sh
  root      6796  0.4 12.2 41760 15644 ?       S       19:03   0:35 /etc/X11/X -au
  root      1575  0.0  0.3  3180  444 ?        S       14:21   0:00 /usr/bin/gdm -
  root      6797  0.0  1.2  3848 1652 ?        S       19:03   0:00 /usr/bin/gdm -
  sb8015th  8267  0.0  3.0  6712 3848 ?        S       20:38   0:00 /usr/bin/gnome
  sb8015th  8331  0.0  2.6  5304 3352 ?        S       20:38   0:00 /usr/bin/sawfi
  sb8015th  8356  0.9 18.2 31716 23340 ?       S       20:38   0:23 /usr/lib/netsc
  sb8015th  8305  0.0  2.4  5152 3128 ?        S       20:38   0:00 /usr/local/bin
  …略…

などと,プロセス名順に並んだ結果が画面上で一画面ずつ見られるというものだ.
&br;
&br;

&ref(/materials/notes.png); 実習

+ 上に示した実例と同じ作業をやってみる.
+ さらに,パイプを三段使う例を考えて,実際に試してみよ.

** Useful command ''tee'': 覚えておくと便利なコマンド ''tee'' [#tee]

リダイレクションやパイプを使うときに,
「ファイルにも取っておきたいけど,
画面で確認しながら作業できないので不安だ」
という思いがあると思う.
&br;
こういう時便利なのが
''tee''
コマンドで,
「標準入力を複製して,標準出力とファイルの両方に出力する」機能を持つ.
&br;
&br;
&ref(/materials/Gnome-Preferences.png); ''tee''の実例

どう使うかというと,例えば先の
''ls␣-lg'' 
の結果をファイルに収めるという例を考えてみよう.
&br;
この作業を先のやり方
''ls␣-lg␣>␣file''
でやると,
''file''
の中身を見るまでどうなっているかわからない.
&br;
しかし,tee コマンドを用いて,
&br; &br;
> ''ls␣-lg␣|␣tee␣sample-file''

&color(,#afff7e){↑ ls コマンドの出力を標準出力に出しながら,かつ,sample-file というファイルにも出力する};
&br; &br;
とすると,結果は画面にも出力されつつ,
sample-file
という名前のファイルにも書込まれることになる.
&br;
慎重に作業を行ないたい,という時はこのコマンドを上手に使うのが良いだろう.
&br;
&ref(/materials/warning.png); 作業過程を記録しておく,という意味で似たようなものに
''script'' 
というコマンドがあることは紹介済みだ.
どちらも使いこなし,適切に使い分けよう.
&br;
&br;
&br;

** Command substitution: 便利! 先読み評価 `` [#tb9d6df7]
** Command substitution: 便利! 先読み評価 `` [#look-ahead-evaluation]

シェルには,コマンド置換という便利な機能がある.
&br;
これは,コマンド中の ` (バッククォート, 逆引用符) で囲んだ部分を
「先に実行してその結果で置き換える」
というものである.
&br;
&br;
これによって,コマンドの出力結果をあたかも文字列のように扱える.
&br;
簡単に言えば,通常ならば分けて行なう複数の操作を一行に書ける,ということである.
&br;
&br;
&ref(/materials/Gnome-Preferences.png); 先読み評価の実例(1)

例えば,test-日付 という名前のファイルを作りたいな〜
と思ったとしよう(日付部分は月日の4桁とか).
&br;
日付を得るには,date コマンドが使える.
これはオプションを適当に指定すれば好きな形式で出力が得られる便利なコマンドだ.
&br;
例えば
''date␣+%m%d''
とすれば 4桁の数字の形で「月」「日」が得られる.
&br;
そこで,  
&br; &br;
> ''touch␣test-''&color(red){''`date␣+%m%d`''};

&color(,#afff7e){↑ date コマンドの出力結果が文字列となる};
&br; &br;
とする. 
すると,コマンド置換によって,
&color(red){''赤字部分が先に実行されて,結果の4桁の数字に置き換えられる''};
ため,test-0529 などという(空っぽの)ファイルが作られることになる.
&br;
&ref(/materials/warning.png); これの応用で,「○○というプロセスを kill する簡単なコマンド」とかも作ることができる.
わざわざ ps␣axu コマンドで調べて〜 とやらずに済むので楽だ.
詳しい学生は少し考えてみよう(grep や awk を使うとよいだろう).
&br;
&br;
&ref(/materials/Gnome-Preferences.png); 先読み評価の実例(2)

もうちょっと複雑な例も考えてみよう.
例えば,t で始まるファイル名をもつファイルが今のディレクトリにいくつあるかざっとみておきたい,
と思ったとしよう.
すると,ls コマンドと wc コマンド(単語数を数える)を用いて
&br; &br;
''ls␣t*␣|␣wc␣-w''
&br; &br;
とすれば,該当するファイルが 3つあれば 3 という答えが得られる.
&br;
で,この作業を良く行なうので,このコマンドを alias などで簡単に入力できるようにしたいとしよう(alias についてはこの授業の後半部分で詳細を示す).
&br;
&br;
&br;
これは,
&br; &br;
''alias␣t-num='ls␣t*␣|␣wc␣-w'''
  
… sh 系の場合
&br; &br;
''alias␣t-num␣'ls␣t*␣|␣wc␣-w'''
  
… csh 系の場合
&br; &br;
と入力しておけばよい.
あとは 
''t-num''
と入力するだけで 3 とか 4 とか答えが得られる.
しかし,数字だけしか表示されないので味気ない.
そこで,echo コマンド(文字列を表示する)と組み合わせて,
&br; &br;
''alias␣t-num='echo␣"&color(red){`ls␣t*␣|␣wc␣-w`};␣t*␣files␣exist."'''
&br; &br;
とする(sh 系の場合). 
すると,
''t-num''
と入力するたびに,
コマンド置換によって,
&color(red){''赤字部分が先に実行されて,結果の数字に置き換えられる''};
ため,

  3 t* files exist.

などという結果が表示されるようになる.
&br;
&ref(/materials/warning.png); こういう場合,単数形と複数形が異なるので,正しい英語にしたかったら面倒だ(^-^).
&br;
&br;

&ref(/materials/notes.png); 実習

+ ''tee''
コマンドと先読み評価に関して,
上に示した実例と同じ作業をやってみる.

&br;&br;
* Customization of the shell: cui 環境のカスタマイズ -シェル設定を中心に- [#xe03ae87]

unix には「自由度を高く,設定は個人の自由に」という基本姿勢がある.
裏を返せば,適切な設定を意識して行なわないといけないかも…ということでもある.
&br;
そこで,シェルの設定について必要最小限を知っておこう.

** Configuration file of the shell: シェルの設定ファイル [#xecc63d7]

シェルおよびシェルから起動されるコマンドの動作の一部に影響を与える設定は,
以下のようなファイル中で行なわれる.

*** sh series: sh 系 [#o242d14c]

: .bashrc |
bash を「非ログインシェルで対話的に」使う場合の設定を書くファイル.
後述するように .bash_profile からもこのファイルが読込まれるのが普通であるため,
端末設定とデフォルトコマンド起動以外はこのファイルに書込めばよい.
&br;
&color(red){''シェルの設定に関しては,通常はこのファイルをいじるだけで済むだろう.''};
: .bash_profile |
bash を「ログインシェルで」使う場合の設定を書くファイル.
端末設定とデフォルトコマンド起動等をこのファイルで行なうのが正しい姿,だろう.
それ以外の設定は .bashrc を読込んで行なうようになっているのが普通.
: .profile |
sh 系シェル共通に使える設定ファイル.
しかし,sh 系シェルを利用する人は現状では bash 
を使う人が多いだろうから,
あまり出番はないだろう(^-^).
: その他 |
.profile 中で変数 ENV に設定したファイルは「対話環境」では自動的に読込まれる.
しかしその機能を使う人は少ないか.

*** csh series: csh系 [#ed0c7aef]

: .tcshrc |
tcsh を使う場合,必ず読込まれるファイル.
環境によらず読込まれるため,完全に共通に使える設定をこのファイルに書く.
具体的には,端末設定とデフォルトコマンド起動以外をこのファイルに書込むか,
環境を判定するやや複雑な設定を書くかである.
(間違った設定を書くと,ログインした途端にログアウトさせられたりする間抜けなことになったりする)
&br;
…とはいえ,難しいことが分からないウチはこのファイルを編集しているだけで済む.
: .login |
ログインした時だけ,.(t)cshrc の読込みの後に読込まれるファイル.
端末設定とデフォルトコマンド起動はこのファイルに書込むのが良い.
詳しいことが分からないウチは触らない方がよいだろう.
: .cshrc |
csh 系シェル共通に使える設定ファイル.
.tcshrc の代わりに使う人も多い.
: その他 |
.tcshrc 中などで source コマンドを用いて別ファイルを読込む設定にすることも多い.
具体的には,alias コマンドだけを別ファイルにするなどの設定がよく見られる.

&br;&br;
** Setting of shell variables: 変数の設定: シェル変数 [#shell-variables]

シェルが固有に持つ変数.
シェル自身の動作にかかわる設定に用いられる.
&br;
名前は小文字で記述することが多い.

: 文法 |
| 意味 | sh系 | csh系 |h
| 作成, 代入 | ''変数名=値'' | ''set␣変数名=値'' |
| 削除 |>|CENTER: ''unset␣変数名'' |
| 表示 |>|CENTER: ''set'' |
| 参照 |>|CENTER: ''$変数名'' |

&br;&br;
** Shell variables: 代表的なシェル変数 [#pb3be2de]

: コマンドサーチパス(PATH: sh系, path: csh 系) |
シェルからコマンドを起動するときに,
どのディレクトリから探してくるのかシェルに教えておくために使う.
つまり,path に設定されているディレクトリにあるコマンドは,
コマンド名を入力するだけで使用できる.
&br;
よく分からないウチは変更しないのがよいだろう.
: プロンプト(PS1: sh系, prompt: csh 系) |
プロンプトとは,シェルを使っているときにコマンド入力行の先頭部分にシェルが表示する文字列である.
&br;
&ref(/materials/Gnome-Preferences.png); bash での設定例.例えば,
&br;
&br;
''PS1="(BAsh)\H<\u>\[\033[1;34m\]\w\[\033[0m\] <\!>"''
&br;
&br;
と入力してみよう.プロンプトがこの設定通りに変化する.この設定はログアウトするまで有効だ.
これをファイル .bashrc の中に記述して 
''source␣.bashrc''
と入力するかログインするのでもよい(その場合は,この設定はずっと有効になる).
&br;
&br;
具体的にいろいろいじってみたければ,
''jman␣bash'' 
もしくは
''jman␣tcsh''
として,「プロンプト」もしくは「Prompt」の項目を読めばよい.
詳しく書いてある.
&br;&br;
: ヒストリ(HISTSIZE: sh系, history: csh系) |
シェルが履歴(history)を取っておくコマンドの数.
少し多めにしておくとよいだろう.
&br;
&br;
: エラー処理,安全化系(ignoreeof, noclobber,noglob 等) |
うっかりミスや知識不足によって発生する支障をなるべく抑制するために用いるもの.
オンラインマニュアルで調べよ.
よく分からないウチはいじらないのがよい.

&br;&br;
** Setting of environment variables: 変数の設定: 環境変数 [#ic2e7ab9]

シェルから起動されるコマンドの動作設定にかかわる変数.
環境変数をどう利用するかはコマンドが決めることである.
&br;
名前は大文字で記述することが多い.

: 文法 |
| 意味 | sh系 | csh系 |h
| 作成, 代入 | (シェル変数として作成した後) &br; ''export␣変数名'' | ''setenv␣変数名␣値'' |
| 削除 | ''unset␣変数名'' | ''unsetenv␣変数名'' |
| 表示 | ''set'' or ''env'' | ''printenv'' |
| 参照 |>|CENTER: ''$変数名'' |

&br;&br;
** Environment variables: 代表的な環境変数 [#pb895ee2]

: エディタ(EDITOR) |
プログラムによっては,途中でエディタを起動するものがある.
そうした時に,どのエディタを起動するのかをこの変数で設定できる.
設定しておかないと vi が起動したりするので,自分の慣れたエディタを設定しておくのがよい.
&br;
&br;
: ページャ(PAGER) |
プログラムによっては,途中で more や less といったページャを起動するものがあるが,
その際にどのページャを起動するのかをこの変数で設定できる.
日本語に対応していないページャだと日本語が読めない等の支障が生ずるので,
適切なページャをを設定しておくのがよい.
&br;
&br;
: 言語(LANG) |
どの言語を用いているか,を指定する.
行儀のよいプログラムならばこの環境変数を見て適切に設定を変えてくれる.
日本語を用いるならば,
Linux やFreeBSD では ja_JP.UTF-8 や ja_JP.eucJP などと設定すればよい.
&br;
&br;
: 端末属性(TERM, TERMCAP 等) |
端末の名前や性質を指定する.
よくわからないけれども何か設定しなければいけない,という状態に追い込まれたら(^-^),
TERM に vt100
を設定しておけばとりあえずしのげるだろう.

** Activation of the configration: 設定ファイルの読み込み [#mdaca8b8]

シェルの設定ファイルを修正して,その効果をみるためにはどうしたらよいだろうか?
&br;
いったんログアウトしてまたログインする? それは「危険」だ.
&br;&br;

&ref(/materials/warning.png); 環境カスタマイズの注意点
&br;
シェルの環境をカスタマイズしているときに,
「設定にかなり厳しいミスをしてしまい,ログインできなくなる」
と通常ユーザではどうしようもなくなることがある.
&br;
&br;
こうならないようにするようには…
+ (後述の) source コマンドでしっかり確認する
+ ''カスタマイズが終わるまで絶対にログアウトしない端末を一つは確保しておく''
+ ''何か設定を変えたら別の端末(ソフト)からログインしてテストする(= 現在の端末(ソフト)はログアウトしない)''

などの対策を常にしておこう.
&br;&br;

** ''source'' command to read the configration: 設定ファイルの読み込みコマンド: ''source'' [#o13e210c]

設定ファイルを修正した後,すぐにその影響をみるために
「設定ファイルを読み込む」には,
&br;&br;
''source␣ファイル名''
&br;&br;
とすればよい.


&ref(/materials/warning.png); 素の sh はこのコマンドが使えず,
&br;
''.␣ファイル名''  (ピリオド,空白, ファイル名)
&br;
という方法しか使えないが…現在はもう気にしなくて良いだろう.

&br;
&br;
&ref(/materials/notes.png); 実習

+ 上に示した例をみながら,
.bashrc ファイルを編集し,プロンプトだけでも変更してみよ.
&br;
&ref(/materials/warning.png); .bashrc ファイルがそもそも無い場合は,次のように設定してから編集せよ.
> ''cd␣~''
> ''touch␣.bashrc''
<
&br;&br;
+ 余裕のある者はさらに,シェルのオンラインマニュアルなどを参考にしていろいろ設定してみよ.

** Alias: エイリアス設定 [#y5a7426d]

エイリアス(alias) とは,コマンドに「別名」をつける機能である.
(素の sh にはこの機能はないが)通常のシェルにはたいていついており,簡単なわりに便利だ.
&br;
&br;
以下の例はなるべく bash 形式で書いてある.

&ref(/materials/Gnome-Preferences.png); alias の使用例:

: タイピングの手間を減らし,ミスを少なくする |
例) 
''alias&#9251;md=&apos;mkdir&apos;''
&br;
例) 
''alias&#9251;em=&apos;xemacs&apos;''
&br;
&br;
: 複雑な動作を 1コマンドに短縮する(新しいコマンドを作る) |
例) 
''alias&#9251;newfile=&apos;touch&#9251;dummy-`date&#9251;+%m%d`&apos;''
&br;
例 csh 系のみ) 
''alias&#9251;printfile&#9251;&apos;a2ps&#9251;\!*&#9251;|&#9251;lpr&apos;''
&br;
&br;
: コマンドのオプションを指定するなどして,デフォルト動作を変更する |
例) 
''alias&#9251;cp=&apos;cp&#9251;-i&apos;''
&br;
例) 
''alias&#9251;mv=&apos;mv&#9251;-i&apos;''
&br;
例) 
''alias&#9251;rm=&apos;rm&#9251;-i&apos;''
&br;
例) 
''alias&#9251;man=&apos;jman&apos;''
&br;
例) 
''alias&#9251;ls=&apos;ls&#9251;--color=auto&#9251;-Fga&apos;''
&br;
&br;
: 変数を設定する |
例) 
''alias&#9251;newpath=&apos;PATH=hogehoge&apos;''


*** Syntax for aliases: エイリアスを用いるための文法 [#x301cb66]

エイリアス単独で考えると,引数を用いることができる
csh 系のシェルの方が便利であるが,
sh 系のシェルの「関数」という仕組みを用いれば機能的にはほぼ同じといってよいだろう.
&br;
&br;
どちらにせよ,きちんとした機能を欲するのであれば
シェルスクリプトを組む手間とあまり変わらないし,
そうなれば特にどのシェルがよい悪いという区別はない(csh 系シェルでシェルスクリプトを組むべきではない,という流派もいる).
&br;&br;

*** Syntax for aliases (sh): エイリアス文法: sh系 [#q816f214]

: 設定 |
''alias&#9251;別名=&apos;コマンド&apos;''
&br;
&br;
ただし,引数は使えない.
&br;
(また,素の sh にはこの機能はない)
&br;&br;
: 解除 |
''unalias&#9251;別名''
&br;&br;
: 表示 |
''alias''
&br;&br;
: 関数設定 |
引数をとる代わりに使う.
&br;
''新関数名(){''
&br;
''内容… ;'' &br;
''内容… ;'' &br;
''}''
&br;
&br;
n 番目の引数を      
''$n''
として参照できる.

&br;&br;
*** Syntax for aliases (csh): エイリアス文法: csh系 [#wfbba2ad]

: 設定 |
''alias&#9251;別名&#9251;&apos;コマンド&apos;''
&br;
csh 系の場合,引数を次のようにして alias に含めることができる.
| 意味 | 記号 |h
| 全ての引数 | ''\!*'' |
| 最後の引数 | ''\!$'' |
| n番目の引数 | ''\!:n'' |
&br;&br;
: 解除 |
''unalias&#9251;別名''
&br;&br;
: 表示 |
''alias''

&br;&br;
&ref(/materials/notes.png); 実習

+ 上に示した alias 例を試してみて,便利そうなものを初期設定せよ.
&br;&br;
+ (余裕がある者用) alias ないしは関数機能を用いて,
二引数の順番を逆にして表示するコマンド swap を用意せよ.
&br;
つまり,
''swap&#9251;a&#9251;b''
と入力すると,
''b&#9251;a''
と表示されるような alias もしくは関数 swap
を実現してみろ,ということである.

** Configration of terminals: 端末設定 [#x019bbd5]

上に出てきた TERM, TERMCAP といった環境変数やそれに類するものを設定する.
bash ならば .bash_profile ファイルで,
csh 系シェルならば .login ファイルで行なうのが良いだろう.
&br;
&ref(/materials/warning.png); 現状では,通常ユーザが端末設定を行なう必要性はあまりない.
変更してトラブルことも多いので,
特に必要がなければ端末設定はしない方がよい.
&br;&br;
ただし,キーバインディング(キー操作)を変えたいという場合だけは,
bash や tcsh のような新しめのシェルでは結構安全な方法が用意されているのでオススメだ.
bash では .inputrc というファイル中にしかるべき設定を,
tcsh では bind コマンドを使って .tcshrc ファイル中でしかるべき設定を行なえばよい.
詳しくはオンラインマニュアルなどで調べること.  


&br;&br;
** Commands launched on login: デフォルトコマンド起動 [#re10f68d]

bash ならば .bash_profile で,
csh 系ならば .login で,ログイン時に起動されるコマンドを書いておく,
ということもできる.
&br;
これをうまく使って,例えば起動時に

+ ディスクの(自分の)使用量を調べる.
+ メールが来ているか調べる.
+ 今日の運勢を占う(^-^).
+ ○○さんが大学のマシンにログインしているか調べる.
+ やらないといけない仕事を表示する(ToT)

などということができる(まあ,今日はそんなにありがたくないが). 

&br;&br;
&ref(/materials/notes.png); 実習

+ ログインするたびに,
&br;
''You use *** KB in this system.''
&br;
という感じでディスク使用量が表示されるようにせよ.
&br;
なお,du というコマンドを使うと良い. 
ただし,オプションは慎重に設定しよう.


* Report: レポート [#t8f67265]

以下の課題について能う限り賢明な調査と考察を行い,
&br; 
''AppliedMath7-Report-04''
&br;
という題名をつけて e-mail にて教官宛にレポートとして提出せよ. なお,レポートを e-mail の代わりに TeX で作成した書面にて提出してもよい.  

** Exercises: 課題 [#kf74fb2c]

+ 本資料の実習部分をすべて行い,それについて「きちんと」報告せよ(やりました,などだけというのはダメだよね).
+ パイプと組み合わせて上手に使うと便利そうなコマンドを紹介せよ.
+ シェルのプロンプト設定を「便利になるように」設定せよ.
+ 「今日の日記を書くためにエディタが起動する」というコマンドを用意せよ.
&br;
具体的には,その日の日付がついたテキストファイルをエディタが開く,
と言う程度でよい.

* about Icons, ClipArts [#me565c48]

For details, see [[&ref(/materials/JNorth_arrow-right-sm.png); this>materials]].

// ━┃┏┓┛┗┣┳┫┻╋


// コマンドライン入力は「行頭を > で始める」.
// コマンドライン出力は「行頭をブランクで始める」.

// 実習アイコン
// &ref(/materials/notes.png); 

// 注意アイコン
// &ref(/materials/warning.png);

// Link アイコン
// &ref(/materials/JNorth_arrow-right-sm.png); 

// OK アイコン
// &ref(/materials/OK.png);

// NG アイコン
// &ref(/materials/NG.png);

// サンプルアイコン
// &ref(/materials/Gnome-Preferences.png);

// 大文字での強調 
// CENTER:&size(24){''ほげほげ''};

// programu source 表記
// #highlighter(language=ruby,number=on,cache=on){{}}

// パイプ
// &brvbar;