シェル (shell) は,ユーザーがコマンド行に打ち込んだコマンド等を解 釈し,コンピュータに実行させる役割をもつプログラムです 1。 ユーザーがコンピュータにログインすると,そのユーザーのためにシェルが動き出しま す。 これをログインシェル (login shell) といいます。 ユーザーがコマンド行にコマンドをタイプして実行できるのは, シェルが動いているからです。
シェルには幾つかの種類があり,
ユーザーがログインシェルとし
て何というシェルを用いるかは,予め管理者が設定しています。
シェルが持つ機能や使い方はシェル毎に違いますので,
echo $SHELL
を実行して,利用中のシェルを確認しましょう2。
/bin/tcsh と出力されますね。
皆さんが使っているシェルは tcsh (ティーシーシェル) です。
次のコマンドはヒストリ一覧を表示します。
historyヒストリ一覧から,過去に実行したコマンド行を選んで再実行するには
!nに続いて <ENTER> を押します 3。ここで n はヒストリ一覧中のヒストリ番号です。
hi で始まるコマンドは複数ありますので,まだ補完はされません。
command [argument ...] >
file
とします。
ここで [argument ... ] は,command に引数を与えたけ
れば argument ... の箇所に与えられることを意味します。
file として,存在しないファイルを指定すれば,file が自動的に作成されます。
file が既存のファイルならば,その内容は command の出力で上書きさ
れます4。
cal 2006 > year
を実行してください。
>
の代わ
りに >>
を使い,
command [argument ...] >>
file
とします。
>
と >>
の使い方を確かめるために,以下を順に実行し
てください。一行実行する度に cat コマンドでファイル now の内容を
確認してください。
date > now cal > now date >> now
ここでは,コマンドの実行結果が画面に表示される仕組みをより正確に説明します。
多くの UNIX コマンドは ``標準出力'' と ``標準エラー出力'' と呼ばれる情報 の出口を持っています。
>
と >>
は,共に実
行するコマンドの標準出力の接続先のみをファイルに切り替えるリダイ
レクトです。標準出力のリダイレクトを用いれば,通常は画面に表示されるコマ
ンドの実行結果を,ファイルに保存することができます。
cal 2006 > year
を実行して結果がファイル year に保存されるのは,
「> year
」の指定により cal コマンドの標準出力が,
画面ではなくファイル year に接続されるためです。
なお,tcsh で標準出力と標準エラー出力の接続先を共にファイルに切り替えるには >&
や >>&
を使います。
cal 2006 > year
において,
「2006
」は cal コマンドに対して出力の変更を指示するものなので,
cal コマンドの引数です。
一方,
「> year
」は
シェルに対して標準出力の接続先変更を指示しているのであり,
cal コマンドの動作を変更するものではありません。
したがって,
「> year
」は cal コマンドの引数ではありません。
何も起きないどころかプロンプトも表示されません。
プロンプトが表示されないままでコマンドを打っても,そのコマンドは 実行されません。
まだ何も起こりませんね。
wc の実行結果が出力され,プロンプトが現れました。wc は実行を終 えました。
ファイル名を指定せずに wc を実行すると,wc はキーボードからの入力を処理 します6。2. においてプロンプトが表示されなかったのは, wc が実行中であり,キーボードからの入力を待っている状態だったからです。
4. で使った CTRL-d は「入力の終わり (正確には,ファイルの終り; EOF = End Of File)」を意味するキーです。 wc は CTRL-d が入力されたのでキーボードからの読み込みを終了し, 実行結果を画面に出力しました7。
なお,上の操作ではキーボードから 2 行 4 単語を入力しましたから,行数と単 語数に関しては wc は正しい結果を出力しています。一方,文字数については, 画面に表示されている入力文字数(空白文字を含む)より 2 文字分多いはずです。 これは,行末に入力した <ENTER> を,wc が文字として数えているからです。 実際,<ENTER> で入力したものは特殊な文字であって,通常の文字として表示 される代りに,画面上では改行として表示されているのです。
コマンドを実行したけれど動作がおかしい,とか, プロンプトが戻るまでの時間が長すぎる, といった場合には CTRL-c によるコマンドの終了を試してみるといいでしょう。 コマンド行でタイプミスをしてしまい,最初から打ち直したい場合にも, CTRL-c が使えます。 ただし,コマンドを正常終了できる場面では,正規の終了操作をすべきです。
command [argument] <
file
を実行します。ここで [argument] は,command に引数を与え
たければ argument に指定できることを表します。
man wc
で調べてください。
wc < year > wc.outとします。 これを試したら,不要な wc.out は削除しましょう。
一行につき 1 ユーザーの情報が出力されますね。 who の出力から行数を求めれば,ログインしている延べユーザー数がわ かります。
who > usercat コマンド等で user の中身を確認してください。
wc -l userユーザー数がわかりましたね。
rm user
|
)」で区切っ
て記述することによって行います。パイプによって連結された一連のコマンドを
パイプライン (pipeline) と言います。
なお,コマンドの標準出力と標準エラー出力の両方を次のコマンドの標準入力に
接続するには,tcsh の場合,|
の代わりに |&
とします。
who | wc -lこの状況を図示したのが次の図です。 パイプと共に wc を実行する場合, wc は標準入力 (stdin) から入力を受け取る必要がありますので, wc の引数にファイル名を指定してはいけません。
ls -la /etc | more
more は引数にファイル名が与えられれば,
そのファイルを直接読み込んで表示しますが,
ファイル名を与えずにリダイレクトやパイプと共に用いると,標準入力から入力を受け取ります。
次の図では ls の引数 (-la /etc) の記述は省略しています。
動作の概要は以下のとおりです。![]()
ls の標準出力をパイプによって more の標準入力に接続しているので, ls の実行結果は画面には出力されません。
ls | sort -r
結果を画面ではなく,ファイル rlist に入れたければ
ls | sort -r > rlist
を実行します。このようにパイプと標準入出力のリダイレクトを同時に利用する
ことが可能です。
command1により,次の図に示す多段のパイプが可能です。 これにより,command1 の出力が command2 で処理され,さらに command3 で処理されます。|
command2|
command3
なお,これまでと同様に,パイプラインの中の各コマンドには引数を与えること もできます。また,4つ以上のコマンドをパイプすることもできますし,その出 力をリダイレクトすることも可能です。![]()
cat, grep, sort, wcはフィルタです。 各コマンドの動作は man コマンド等で確認できます。
echo とリダイレクトを使って,自分の学生番号と名前の入ったファイル myname を作ってください。
hakodateであるファイル campus はありますか。無ければ echo コマンドを使っ て作成してください。echo は複数回実行してかまいません。
sapporo
asahikawa
kushiro
iwamizawa
tr a A
を実行してから
hakodate sapporoを標準入力(キーボード)から入力してください。入力を終えた ら tr コマンドを正常終了させてください。
tr a-z A-Z
を実行
してみましょう。入力には前項と同じものを与えてください。
では,ファイル campus の内容をすべて大文字にしたものを,ファイル CAMPUS に保存しましょう。tr コマンド,および標準入力と標準出力の リダイレクトを使ってください。
うまくいったら,ここで作成したファイルは削除しましょう。
ファイル campus の 中身を,sort コマンドで辞書順に並べ替えて画面に表示しましょう。 さらにその表示を全て大文字にしましょう。
grep pattern file...の書式で実行すると,grep はfile... から patten を含む 行のみを抽出しますが,file... を省略すると,標準入力から入 力を読み込みますので,フィルタとして利用できます。
まず,grep ko campus や grep sa campus を実行して, grep の動作を確認してください。
次に who の出力の中から自分の情報のみを出力しましょう。 grep とパイプを使います。
cat コマンドは,引数にファイル名を指定せずに実行すると, 標準入力から入力を読み込みこんでそのまま出力します。 オプション -n をつけると行番号をつけて出力します。
さて,who コマンドの出力をを辞書順に並べて表示しましょう。 さらに,その結果に行番号を付けて出力しましょう。