標準入出力, リダイレクション,パイプ / シェルの設定
標準入出力, リダイレクション,パイプ
短い単純なプログラムを組み合わせて複雑な動作を実現する
unix の重要なポリシーの一つ.
短い単純なプログラムのほうが作りやすく、性能もあげやすく、かつ、バグも少なくて、良いことずくめだという考え.
上に述べたのは Unix の重要なポリシーの一つで、 そのための仕組みの一つがこれから説明する標準入出力とその制御であるリダイレクション,パイプライン.
まず少し基本的な話をすると,unix では通常のプログラムは 「標準入力」「標準出力」「標準エラー出力」という特別な入出力先を持っている. そしてこの「標準入出力」が繋がる相手をユーザーが自由に制御することができ, その方法が「リダイレクション」や「パイプライン」なのである.
上図のように,プログラムの入出力先を”「プログラムの実行時にユーザが勝手に変えられる」”のである.
上で述べたポリシーにより “「unix には単機能プログラムが たくさんある」” ため,この機能と組み合わせると
という「おいしい」状況が unix に出現する. これは本当に便利なので,ぜひ習得しよう.
標準入出力とは何か
unix ではプログラムはチャネル,もしくは デスクリプタ(ファイル記述子)とよばれる出入り口ファイルを用いてデータの入出力を行なう. 機器や環境に依存しない汎用入出力を可能とする目的で,unix ではこのうちの最初の 3つ(0 〜 2番)のデスクリプタを特別なものとして決めている. これらが標準入出力とよばれるものであり,次のような性質を持っている.
IO(Input/Output) | 説明 |
---|---|
標準入力(stdin) | プログラムが汎用データ入力に使う. 指定していない場合,デフォルト値( 通常は端末キーボード )が用いられる. |
標準出力(stdout) | プログラムが汎用データ出力に使う. 指定していない場合,デフォルト値( 通常は端末ディスプレイ )が用いられる. |
標準エラー出力(stderr) | プログラムがエラーメッセージの汎用出力に使う. 指定していない場合,デフォルト値(通常は端末ディスプレイ)が用いられる. |
これら標準入出力によるデータの入出力の相手はプログラムを起動したシェルが決める約束になっている.
注意: 何も指定しないとき(デフォルト)は,
(入力)キーボード → プログラム → (出力)ディスプレイ
と繋がっている.
リダイレクション
標準入出力先を何にするかはユーザーが簡単に変更できる
これを上手に使えば,同じプログラムの出力をファイルへ出力したり,ディスプレイへ出力したり, 出力させなかったりと変更することを「プログラム側で全く考慮する事なく」 行なうことができる.
この「標準入出力先を変更すること」,すなわち標準入出力の制御を,(I/O)リダイレクションとよぶ.
そこで,以下に「一つのプログラムに対する」具体的なリダイレクションの方法を示そう.
注意: 二つのプログラムの入出力を直接繋げてしまう「同時リダイレクション」は特別に「パイプライン」と呼ばれる. 詳しくは後述する.
文法がシェルによってわずかに異なるため,以下に sh 系と csh 系とにわけて示しておく. (多くの学生は,たぶん bash を使っているだろうから,とりあえず sh 系の方だけをみておけばよいだろう)
多すぎて良く分からないという場合は, 赤字 で書かれている3ヶ所を理解して覚えるだけでも十分だろう.
リダイレクションのやり方… コマンド名の後ろに以下の「おまじない」をつければよい
標準入力を変更するには
sh/csh 共通 | 意味 |
---|---|
<␣hoge | 標準入力を hoge というファイルに変更する. |
<<␣hoge 内容行1 内容行2 … 内容行最後 hoge |
標準入力を最初の “hoge” から次の “hoge” までの内容 に変更. "Here Document" 機能とよばれる. |
標準出力を変更するには
sh 系 | csh 系 | 意味 |
---|---|---|
>␣hoge | 同左 | 標準出力を hoge というファイルに変更する. “hoge” というファイルが存在しなければ作成する. 既に存在するならば内容は消去されて上書きされてしまう 注: noclobber 変数をセットしておくと、消去・上書きを防げる(シェルに依る). |
>¦␣hoge | >!␣hoge | noclobber 変数を無視して 上の動作を行う. |
>>␣hoge | 同左 | 標準出力の出力を hoge というファイルの末尾に追加していく. “hoge” が存在しなければ作成される. 注: noclobber 変数をセットしておくと “hoge” が存在しなければエラーになる(シェルに依る). |
(該当なし) | >>!␣hoge | noclobber 変数を無視して 上の動作を行う. |
標準エラー出力を変更するには
sh 系 | csh 系 | 意味 |
---|---|---|
2>␣hoge | (該当なし) | 標準エラー出力を “hoge” というファイルに変更. ファイルの存在, noclobber 変数との関係は上記同様. |
(該当なし) | (“コマンド”␣>␣hoge )␣>&␣boke | 標準出力を “hoge” というファイルに, 標準エラー出力を “boke” というファイルに各々変更. (標準エラー出力だけを変更することはできない) ファイルの存在, noclobber 変数との関係は上記同様. |
>␣hoge␣2>&1 | >&␣hoge | 標準出力と標準エラー出力の出力を両方とも “hoge” というファイルに変更. ファイルの存在, noclobber 変数との関係は上記同様. |
>¦␣hoge␣2>&1 | >&!␣hoge | noclobber 変数を無視して 標準出力/エラーの両方を “hoge” という ファイルに出力. |
>>␣hoge␣2>&1 | >>&␣hoge | 標準出力/エラーの両方を “hoge” というファイルの末尾に追加. ファイルの存在, noclobber 変数との関係は上記同様. |
(該当なし) | >>&!␣hoge | noclobber 変数を無視して 標準出力/エラーの両方とも “hoge” という ファイルの末尾に追加. |
リダイレクションの実例
例えば, ls␣-lg の結果をファイルに保存してゆっくり調べたいとしよう. こういうときは
ls -lg > sample-file
↑ ls コマンドの出力先を,sample-file というファイルにリダイレクトしている
とすれば, “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/
…略…
というように,中身をいつでも繰り返しゆっくり見ることができる.
さらに,ここにあるファイルをサイズ順にリストアップしてみたいな〜
と思ったとしよう.
すると,sort
コマンド(中身を並べる)を使って,
“sample-file”
の中身の,”この場合は” 5 番目の要素を大きい順に並べればよい.
注意: “ls␣-lg” コマンドの結果の何番目にファイルサイズが表示されるかは環境に依存するので,自分で数えてから実行しよう.
このケースでは,入力と出力の両方をリダイレクションすれば便利だ. だから例えば以下のようにすればよい.
sort -k 5 -nr < sample-file > sample-file2
↑ sort コマンドの入力先を sample-file に,出力先を sample-file2 にリダイレクトしている
こうすれば, “sample-file2” に望みの結果が入っている.
実習
- 上に示した実例と同じ作業をやってみる.
- さらに,同様の方法で, 二つのディレクトリの中でサイズの大きな方から順に5つのファイルをリストアップするにはどうしたらよいか考えよ. そして実際に試してみよ.
覚えておくと便利なリダイレクト先 /dev/null
ファイルとしては空っぽの “ブラックホール” と思えば良い.
上の表を見ても分かるように,リダイレクト先には通常はファイルを指定する. この時,unix に存在する特別なファイル “/dev/null” が非常に便利に使えるので覚えておこう. このファイルは「ブラックホールファイル」とでも言うべき次の性質を持っている.
- 標準入力先に指定すると,「何も出てこない」
- 標準出力先に指定すると,「全て飲み込んで,何も変化しない」
よって,この性質を使って次のようなことができる.
空っぽの新しいファイルを作れる.
cp /dev/null ファイル名
とすると,新しく空っぽのファイルが作られる. 新しくファイルを作成する方法としては,他に
touch ファイル名
とするという方法もよく知られている.
注意: ファイルを作るには他にも様々なひねくれた方法が考えられる. いろいろ考えてみよ.
とっておく必要のない出力を捨てることができる(しかも素早く).
やり方は次の表の通り.
sh 系の場合 | csh 系の場合 |
---|---|
コマンド␣ >␣/dev/null␣ 2>&1 | コマンド␣ >&␣/dev/null |
このようにすれば,標準出力と標準エラー出力の両方がブラックホールへと消えていくことになる.
そんなことをしたくなる場面があるのか? と思うかもしれないが, これがあるのだ. 例えば, ジョブをバックグラウンドで実行させていて,その出力が邪魔な時や, コマンドを nohup で実行させる場合, プログラムの計算速度などを純粋に測定するためにデータの出力に時間がかかると困る時,などがそれにあたる.
他にも,デバッグ情報などを常にエラー出力に出すことにしておいて, 不要なときはエラー出力先を “/dev/null” にしておく,という使い方や、実行結果には興味が無いが実行時間に興味があるのでファイルアクセスを減らしたい、というような場合にも使える.
パイプ
原理的には,リダイレクションを使えば,
Program A (出力)→ ファイル →(入力) Program B
として複数のプログラムの入出力を ファイルを媒介して 繋げられる. しかし、その場でデータを受け渡す目的だけならばファイルを介するのは無駄だし遅い.
そこで, Program A の標準出力と Program B の標準入力を直接繋いでしまう方法 が unix には用意されている.
この同時リダイレクションとでもよぶべき方法は, 「パイプ」もしくは「パイプライン」と呼ばれ,次のように使う.
sh 系 | csh 系 | 意味 |
---|---|---|
Program A ␣¦␣ Program B | 同左 | Program A の標準出力を Program B の標準入力として渡す. |
Program A␣2>&1␣¦␣Program B | Program A ␣¦&␣ Program B | Program A の標準出力と標準エラー出力を Program B の標準入力として渡す. |
注意: なお、パイプは好きなだけ何段にも重ねることができる!! ので覚えておこう.
パイプの実例
例えば,
ps␣axu
の結果を画面で見るとしよう.
そのままこのコマンドを実行すると,
大量のデータが出力されて画面上を流れていってしまうのは経験しているだろう.
こういうときは,less
コマンドなどを用いて,一画面ずつ表示させるのが定石である.
それには
ps axu | less
↑ ps コマンドの出力と less コマンドの入力を直接パイプで繋いでいる
とすればよい.
さらに,この結果をプロセスの名前順に並べ直すことによって見易くしたいな〜
と思ったとしよう.
すると,sort
コマンドを使って,上の結果を並べ直せば良い.
それにはどうするかというと,パイプを二回使って,
ps axu | sort -k 11 | less
↑ ps コマンドの出力と sort コマンドの入力をパイプで繋ぎ,さらに sort コマンドの出力と less コマンドの入力をパイプで繋いでいる(パイプを二段使っている)
注意: ps
コマンドの結果の何番目にプロセス名が表示されるかも環境に依存する.自分で数えてから 実行しよう.
とすれば,
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
…略…
などと,プロセス名順に並んだ結果が画面上で一画面ずつ見られるというものだ.
実習
- 上に示した実例と同じ作業をやってみる.
- さらに,パイプを三段使う例を考えて,実際に試してみよ.
覚えておくと便利なコマンド tee
出力を画面とファイルの両方に出力できるよ
リダイレクションやパイプを使うときに,
「ファイルにも取っておきたいけど,
画面で確認しながら作業できないので不安だ」
という思いがあると思う.
こういう時便利なのが tee
コマンドで,
「標準入力を複製して,標準出力とファイルの両方に出力する」機能を持つ.
tee
の実例
例として先の
ls␣-lg
の結果をファイルに収める例を考えてみよう.
この作業を先のやり方
ls␣-lg␣>␣file
でやると,
“file”
の中身を見るまでどうなっているかわからない.
しかし,tee
コマンドを用いて,
ls -lg | tee sample-file
↑ ls コマンドの出力を標準出力に出しながら,かつ,sample-file というファイルにも出力する
とすると,結果は画面にも出力されつつ,
sample-file
という名前のファイルにも書込まれることになる.
慎重に作業を行ないたい,という時はこのコマンドを上手に使うのが良いだろう.
注意: 作業過程を記録しておく,という意味で似たようなものに script
というコマンドがあることは紹介済みだ.
どちらも使いこなし,適切に使い分けよう.
便利! 先読み評価(コマンド置換)
` (バッククォート, 逆引用符) で囲んだ部分 や \$( ) で囲んだ部分を先に実行して結果で置き換えてくれるよ
どっちを使っても良いけど、先の応用を効かせやすいのは \$( ) で囲む方だね.
シェルには,コマンド置換という便利な機能がある. これは,コマンド中の ` (バッククォート, 逆引用符) で囲んだ部分や $( ) で囲んだ部分を「先に実行してその結果で置き換える」というものである. これによって,コマンドの出力結果をあたかも文字列のように扱える.
簡単に言えば,通常ならば分けて行なう複数の操作を一行に書ける ということである.
先読み評価(コマンド置換)の実例
例えば,test-日付 という名前のファイルを作りたいな〜 と思ったとしよう(日付部分は月日の4桁とか).
日付を得るには,date
コマンドが使えるのでこれを使わない手はない.
これはオプションを適当に指定すれば好きな形式で出力が得られる便利なコマンドで、
例えば date␣+%m%d
とすれば 4桁の数字の形で「月」「日」が得られる.
そこで,
touch test-`date +%m%d`
とするか、
touch test-$(date +%m%d)
↑ date コマンドの出力結果が文字列となる
とすると,コマンド置換によって, data +%m%d という部分が先に実行されて,結果の4桁の数字に置き換えられる ため,test-0505 などという空っぽのファイルが作られることになる.
注意: テンポラリファイルを作る専用のコマンド mktemp
が存在する.何か実際に作業する際には結構便利なので覚えておこう.
注意: コマンド置換の応用で,「○○というプロセスを kill する簡単なコマンド」というようなものも作ることができる. わざわざ ps␣axu コマンドで調べて〜 とやらずに済むので楽だ. 詳しい学生は少し考えてみよう(grep や awk を使うとよいだろう).
先読み評価の実例をもう一つ
もうちょっと複雑な例も考えてみよう.
例えば,t で始まるファイル名をもつファイルが今のディレクトリにいくつあるかざっとみておきたい,
と思ったとしよう.
すると,ls
コマンドと wc
コマンド(単語数を数える)を用いて
ls t* | wc -w
とすれば,該当するファイルが 3つあれば 3 という答えが得られる(ディレクトリがあるとまた話が変わるよ).
しかし,数字だけしか表示されないので味気ない.
そこで,echo
コマンド(文字列を表示する)と組み合わせて,
echo "`ls t* | wc -w` t* files exist."
とするか、もしくは
echo "$(ls t* | wc -w) t* files exist."
とすると,コマンド置換によって, ls t* | wc -w 部分が先に実行されて,結果の数字に置き換えられる ため,例えば
3 t* files exist.
などという結果が表示されるようになる.
注意: こういう場合,単数形と複数形が異なるので,正しい英語にしたかったら面倒だ(^-^).
実習
- “tee” コマンドと先読み評価に関して, 上に示した実例と同じ作業をやってみよう.
cui 環境のカスタマイズ -シェル設定を中心に-
unix には「自由度を高く,設定は個人の自由に」という基本姿勢がある. 裏を返せば,適切な設定を意識して行なわないといけないかも…ということでもある.
Unix のデフォルト設定は使いにくい
unix はデフォルトではほぼ何も設定してくれない.
そのままではまず絶対に使いにくいので、積極的に設定を変えていこう.
以下,シェルの設定について必要最小限を知っておこう.
シェルの設定ファイル
シェルおよびシェルから起動されるコマンドの動作の一部に影響を与える設定は, 以下のようなファイルの中に書いた設定で決まる.
sh 系の設定ファイル
ファイル名 | 解説 |
---|---|
.bashrc | bash を「非ログインシェルで対話的に」使う場合の設定を書くファイル. 下記の .bash_profile からも通常はこのファイルが読込まれる. よって、端末設定とデフォルトコマンド起動以外はこのファイルに書込めばよい. シェルの設定に関しては,通常はこのファイルをいじるだけで済むだろう. |
.bash_profile | bash を「ログインシェルで」使う場合の設定を書くファイル. 端末設定とデフォルトコマンド起動等をこのファイルで行なうのが正しい姿,だろう. それ以外の設定は .bashrc を読込んで行なうようになっているのが普通. |
.profile | sh 系シェル共通に使える設定ファイル. しかし,sh 系シェルを利用する人は現状では bash を使う人が多いだろうから, あまり出番はないだろう(^-^). |
その他 | .profile 中で変数 ENV に設定したファイルは対話環境では自動的に読込まれる. しかしその機能を使う人は少ないか. |
csh系の設定ファイル
ファイル名 | 解説 |
---|---|
.tcshrc | tcsh を使う場合,必ず読込まれるファイル. 環境によらず読込まれる. 共通に使える設定はこのファイルに書くと良い. 「端末設定とデフォルトコマンド起動」はこのファイルに書かないか, 環境を判定するやや複雑な設定を書くことになる. まあ、普通はこのファイルを編集しているだけで済む. |
.login | ログイン時だけ,.(t)cshrc の読込みの後に読込まれるファイル. 端末設定とデフォルトコマンド起動はこのファイルに書込むのが良い. 詳しいことが分からないウチは触らない方がよいだろう. |
.cshrc | csh 系シェル共通に使える設定ファイル. .tcshrc の代わりに使う人も多い. |
その他 | .tcshrc 中などで source コマンドを用いて別ファイルを読込む設定にすることも多い. 具体的には,alias コマンドだけを別ファイルにするなどの設定がよく見られる. |
変数の設定: シェル変数
シェルが固有に持つ変数をこう言う. シェル自身の動作にかかわる設定に用いられる. 名前は小文字で記述することが多い. 使い方等は以下のとおり.
意味 | sh系 | csh系 |
---|---|---|
作成, 代入 | 変数名=値 | set␣変数名=値 |
削除 | unset␣変数名 | 同左 |
表示 | set | 同左 |
参照 | $変数名 | 同左 |
代表的なシェル変数
シェルがもつ独自の変数、シェル変数のうち、少しだけ紹介しておこう.
シェル変数 | 解説 |
---|---|
PATH (コマンドサーチパス) |
コマンドを起動するときに, どのディレクトリから探してくるのかをシェルに教えておくもの. path に設定されているディレクトリにあるコマンドは, コマンド名を入力するだけで使用できる. よくわからないうちは追加のみを行うようにしておこう. Windows にも同じ名前で同じ機能をもつ環境変数がある. |
PS1: sh系, prompt: csh 系 (プロンプト) |
コマンド入力行の先頭部分にシェルが表示する文字列のこと. bash では例えば, PS1="(BAsh)\H<\u>\[\033[1;34m\]\w\[\033[0m\] <\!>" と入力すると、プロンプトがこの設定通りに変化する. これをファイル .bashrc の中に記述して source .bashrc と入力するかログインし直しても良い. |
HISTSIZE: sh系, history: csh系 (ヒストリ) |
シェルが履歴(history)を取っておくコマンドの数. 少し多めにしておくとよいだろう. |
ignoreeof, noclobber,noglob 等 (エラー処理,安全化系) |
うっかりミスや知識不足によって発生する支障を予防する. オンラインマニュアルで調べておこう. |
もう少し詳しく知りたければ、 man␣bash もしくは man␣tcsh として,シェル変数の項目を読めばよい. びっくりするぐらいたくさんあるぞ.
変数の設定: 環境変数
シェルから起動されるコマンドの動作設定にかかわる変数をこういう. シェルだけでなく、いろんなコマンドが参照する前提だ. 名前は大文字で記述することが多い. 使い方等は以下のとおり.
意味 | sh系 | csh系 |
---|---|---|
作成, 代入 | (シェル変数として作成した後) export␣変数名 もしくは、合わせて1行で exprot␣変数名=値 としてしまう方が良いかも. |
setenv␣変数名␣値 |
削除 | unset␣変数名 | unsetenv␣変数名 |
表示 | set or env | printenv |
参照 | \$変数名 or ${変数名} | 同左 |
代表的な環境変数
環境変数 | 解説 |
---|---|
HOME (ホームディレクトリ) |
ユーザのホームディレクトリ. Unix の場合はアカウント作成時に事実上設定されるので、いじらなくて良い. Windows では自分で設定したほうが幸せになれるだろう. |
EDITOR (エディタ) |
デフォルトのエディタ. 設定しておかないとおそらく vi が起動するので,emacs あたりを設定しておくのがよい. |
PAGER (ページャ) |
デフォルトの画面表示ソフト. 日本語に対応したものを設定しておくのがよい. |
LANG (言語) |
デフォルトの言語. プログラムがこの環境変数を見て適切に設定を変えてくれることがある. C に設定しておくと無難だが、もちろん英語表記になる. 日本語を用いるならば, Linux やFreeBSD では ja_JP.UTF-8 や ja_JP.eucJP などと設定すればよい. |
TERM, TERMCAP (端末属性) |
端末の名前や性質を指定する. 何か設定しなければいけないという状態に追い込まれたら(^-^), TERM に vt100 を設定しておけばとりあえずしのげるだろう. |
設定ファイル修正の注意
シェルの設定ファイルを修正して,その効果をみるためにはどうしたらよいだろうか? いったんログアウトしてまたログインする? それは「危険」だ.
シェルの設定ファイルの修正中は絶対にログアウトや exit をするな!
修正に失敗すると二度とログインできなくなることがあるので、設定のミスが無くなるまでログアウトしないようにしよう.
もしそうなったら… 管理者に泣きつけばなんとかなる.
シェルの設定ファイルを修正する時は、以下のように行動しよう.
- (後述の)
source
コマンドで設定ファイルが読み込まれたときの反応をしっかり確認する - カスタマイズが終わるまで絶対にログアウトしない端末を一つは確保しておく
- 何か設定を変えたら別の端末(ソフト)からログインしてテストする(= 現在の端末(ソフト)はログアウトしない)
設定ファイルの読み込みコマンド: source
設定ファイルを修正した後,その場でその影響をみようとして「設定ファイルを読み込む」には,
source ファイル名
とすればよい.
例えば、設定ファイルである .bashrc ファイルを読み込みたければ、
source ./.bashrc
とする.
注意: セキュリティ対策の一環で、.(ピリオド)で始まるファイル名は直に指定すると無視される設定になっていることが多い.
つまり、
source .bashrc (← たぶん動かない)
とすると「そんなファイルは無いぜ」と言われてエラーになったりする.
そのため、上では ./ をファイル名の前につけて source
コマンドを使っている( . は「今居るディレクトリ」という意味).
注意: なお、素の sh は source
コマンドが使えず,
. ファイル名 (=ピリオド,空白, ファイル名)
という方法しか使えないそうだが…現在はもう気にしなくて良いだろう.
実習
- 上に示した例をみながら,emacs などで ~/.bashrc ファイルを編集し,プロンプトだけでも変更してみよ.
注意: ~/.bashrc ファイルがそもそも無い場合は,touch
コマンドなどで ~ ディレクトリにファイルを作ってから設定を書き込めば良い( ~ はユーザのホームディレクトリ). 具体的には、
cd ~
touch .bashrc
などとすればいいだろう.
- 余裕のある者はさらに,シェルのオンラインマニュアルなどを参考にしていろいろ設定してみよ.
エイリアス(別名)設定
エイリアス(alias) とは,コマンドに「別名」をつける機能である. 通常のシェルにはたいていついている機能で,簡単なわりに便利だ.
以下、例をあげよう. なるべく bash 形式で書いてある.
目的等 | aliasサンプル |
---|---|
タイピングの手間を減らし,ミスを少なくする | 例) alias␣md='mkdir' としておいて、md dummy とすると dummy ディレクトリが作れる. 他の例) alias␣em='emacs' |
複雑な動作を 1コマンドに短縮する(新しいコマンドを作る) | 例) alias␣newfile='touch␣dummy-$(date␣+%m%d)' 例 csh 系のみ) alias␣printfile␣'a2ps␣!*␣|␣lpr' |
コマンドのオプションを指定するなどして,デフォルト動作を変更する | 例) alias␣cp='cp␣-i' 例) alias␣mv='mv␣-i' 例) alias␣rm='rm␣-i' 例) alias␣man='jman' 例) alias␣ls='ls␣–color=auto␣-Fga' |
変数を設定する | 例) alias␣newpath='PATH=hogehoge' |
エイリアスの文法
エイリアス単独で考えると,引数を用いることができる csh 系のシェルの方が便利であるが, sh 系のシェルの関数という仕組みを用いれば機能的にはほぼ同じといってよいだろう. どちらにせよ,きちんとした機能を欲するのであれば シェルスクリプトを組む手間とあまり変わらないし、その方がなにかと扱いやすい. 他にも細かい注意点が多数あるので あまり複雑なエイリアスはおすすめしない.
エイリアス文法: sh系
機能 | 文法と解説 |
---|---|
設定 | alias␣別名='コマンド' ただし,引数参照はできない…はず. |
解除 | unalias␣別名 |
表示 | alias |
関数設定 | 引数参照をしたいときは、alias の代わりに関数を使うと良い.文法は以下のとおり.設定ファイルなどに書き込んで使う. 新関数名(){ 内容… ; 内容… ; } この関数では、n 番目の引数を \$n として参照できる. |
エイリアス文法: csh系
機能 | 文法と解説 |
---|---|
設定 | alias␣別名␣'コマンド' csh 系の場合,次のように書くと引数を alias 中で参照できる. \!* (意味:全ての引数) \!$ (意味:最後の引数) \!:n (意味:n番目の引数) |
解除 | unalias␣別名 |
表示 | alias |
実習
上に示した alias 例を試してみて,便利そうなものを初期設定せよ.
(余裕がある者用)
alias
ないしは関数機能を用いて,二つの引数の順番を逆にして表示するコマンドswap
を作ってみよ.
つまり, swap␣a␣b と入力すると, b␣a と表示されるような alias もしくは関数 swap を実現してみろ,ということである.
端末設定
注意: 現状では,通常ユーザが端末設定を行なう必要性はあまりない. 変更してトラブルことも多いので,わからないうちは端末設定は変えない方がよい.
必要ならば、上に出てきた TERM, TERMCAP といった環境変数やそれに類するものを設定する. bash ならば .bash_profile ファイルで, csh 系シェルならば .login ファイルで行なうのが良いだろう.
ただし,キーバインディング(キー操作)を変えたいという場合だけは, bash や tcsh のような新しめのシェルでは結構安全な方法が用意されているのでオススメだ. bash では .inputrc というファイル中にしかるべき設定を, tcsh では bind コマンドを使って .tcshrc ファイル中でしかるべき設定を行なえばよい. 詳しくはオンラインマニュアルなどで調べよう.
デフォルトコマンド起動
bash ならば .bash_profile で, csh 系ならば .login で,ログイン時に起動されるコマンドを書いておく, ということもできる.
これをうまく使って,例えば起動時に
- ディスクの(自分の)使用量を調べる.
- メールが来ているか調べる.
- 今日の運勢を占う(^-^).
- ○○さんが大学のマシンにログインしているか調べる.
- やらないといけない仕事を表示する(ToT)
などということができる. まあ,今時はこれらの機能はそんなにありがたくないが、知っていると助かることもあるだろう.
実習
- ログインするたびに, You use xxx MB in this system.
という感じで, ユーザ個人のディスク使用量が表示されるようにしてみよう.
なお,du
というコマンドを使うと良い. ただし,オプションは慎重に設定しよう.
レポート
以下の課題について能う限り賢明な調査と考察を行い,
AppliedMath7-Report-03
という題名をつけて e-mail にて教官宛にレポートとして提出せよ. なお,レポートを e-mail の代わりに TeX で作成した書面にて提出してもよい.
課題
- 本資料の実習部分をすべて行い,それについて「きちんと」報告せよ(やりました,などだけというのはダメだよね).
- パイプと組み合わせて上手に使うと便利そうなコマンドを紹介せよ.
- シェルのプロンプト設定を「便利になるように」設定せよ.
- 「今日の日記を書くためにエディタが起動する」というコマンドを用意せよ.
具体的には,その日の日付がついたテキストファイルをエディタが開くと言う程度でよい.