第7週


シェルの機能


この授業の最初の方でUNIXのシェルには色々な機能があると言いましたが 今週はそのいくつかについて学習することにしましょう。 UNIXには前にも言ったようにいくつものシェルがありますが、まずは 今皆さんが使っている csh(Cシェル)の機能についてみてみましょう。

*Cシェルの機能1

次はCシェルで使える機能の例としてシェル変数の使用をしてみましょう。

*Cシェルの機能2

今度はちょっと違ったシェルを使ってみましょう。 Cシェルの機能を全て引き継ぎ更に拡張機能を持った tcsh を使ってみるこに します。

*tcsh の機能

tcsh を使ってみた感想はどうでしょうか。 tcsh が気に入ったら皆さんのログインしたときのシェルを tcsh にすることも 可能です。

それでは今週の課題です。

+今週の課題

これで今週の授業は終わりです。 お疲れさまでした。


ホームに戻る
スケジュールに戻る

Cシェルの機能1

この授業でシェルではワイルドカード「*」が使えることをお話しました。 ワイルドカードは一種のコマンド行のシェルによる置換えです。 ここではシェルによるコマンド行の置き換えに関係する機能をみてみましょう。

まずファイルをコピーしましょう。

    % mkdir week07
    % cd week07
    % mkdir manyfile
    % cd manyfile
    % cp ~asakaguc/semia2.www/data/manyfile.tar ./
    % tar xvf manyfile.tar

最後の tar コマンドを実行すると manyfile というディレクトリーに 沢山のファイルができたはずです。 この tar コマンドは Tape Archive の略で沢山のファイルを一つの ファイルにまとめたりそれをまた元のファイルに戻したりするコマンド です。 manyfile.tar というファイルは tar コマンドで一つにまとめられたファイルで 上のコマンドではそれを元に戻しています。 詳しいことは tar コマンドの man を見てください。

さて元に戻されたファイルを使ってシェルの機能を見てみましょう。 ワイルドカード「*」は前にも出てきましたが思い出すために実際に 実行してみましょう。

    % ls *1.*

このコマンドではファイル名の途中に「1.」を含むファイルを全てリストアップ します。 ワイルドカード「*」の機能はあらゆる文字列に置き換えられるのでしたね。 しかしもう少しきめ細かなファイルの選択をしたい場合があります。 例えばファイル名が「a」「b」「c」「d」のいずれかで始まるファイルで ファイルの途中に「1.」を含むファイルを探したい場合は [ ] が使えます。

    % ls [a-d]*1.*

[ ] で挟まれた部分は1文字に置き換えられますが置き換わる文字は アルファベットの順番で「a」から「d」の文字のうちのいずれかです。 [ ] の中の「-」は「何々から何々」という意味で使われています。 [ ] の挿入される位置は上の例では先頭ですがどの位置にも挿入できます。 大文字と小文字は区別されます。 以下のコマンドの結果と先ほどのコマンドの結果を比べて見て下さい。

    % ls [A-D]*1.*

ところで上の例のように探したいファイルの先頭文字が「a」から「d」と 連続しているとは限りません。 例えば「a」「f」「n」「z」のいずれかで始まるファイルを選択したい場合には 全ての文字を [ ] 中にリストアップします。

    % ls [afnz]*1.*

では2文字目が「c」のファイルを探すのはどうしたら良いでしょうか。 「*」は何文字にも変換されるので1文字目に置くのは適当ではありません。 この場合は「?」が使えます。

    % ls ?c*

「?」は任意の1文字の置き換えられます。 シェルの機能としてはこれ以外にも多くの置換機能がありますがこれくらい にして次は Cシェルのヒストリー機能について見てみましょう。 まずはファイルをコピーしましょう。

    % cd ..
    % mkdir somefile
    % cd somefile
    % cp ~asakaguc/semia2.www/data/somefile.tar ./
    % tar xvf somefile.tar

3個のファイルができたことと思います。 ではこれらのファイルを使って以下のコマンドを実行してください。

    % ls file.*
    % cat file.a 
    % cat file.a file.b
    % cp file.a file.a2
    % history

最後の history コマンドは今までに実行したコマンドの履歴(ヒストリー) をみるコマンドです。 各コマンドの最初には通し番号が打っています。 この番号は皆さんがログインした後から1から順番に付いている番号です。 Cシェルではこのコマンドの履歴を再利用することができます。 まず実行したコマンドを再実行するにはイクスクラメションマーク「!」に 通し番号を付けてやります。 例えば上のコマンドの「ls file*」に付いている番号が 30 だとします (皆さんの場合は番号が違っていると思いますので正しい番号を入れて下さい)。

    % !30

上のコマンドを打つと確認のために再実行するコマンドを端末上に表示した後に コマンドを再実行します。 その他のコマンドも再実行して下さい。

    % !31
    % !32
    % !33
    % !34

どうです再実行のやり方がわかりましたか。 しかし再実行する際に番号を調べなければいけないのが不便です。 そのために別の再実行のし方として「!」に続けて実行済みのコマンドの 一部を打ち込むやり方があります。

    % !ls
    % !l
    % !cat
    % !ca
    % !cp

この再実行のやり方の際には、実行済みのコマンドを全て打ち込む必要は ありませんがシェルが再実行したいコマンドがわかる程度まで長く打ち込む 必要はあります。 例えば「!c」というコマンドは「cat」にも「cp」にも該当しますからシェルは 当然区別できません。 この場合には「c」で始まりより後に実行されたコマンドが再実行されます。 コマンドは単純に再実行するだけではなくてコマンド行に文字を 付け足すこともできます。

    % !ca file.c

この場合「!ca」は「cat file.a file.b」に変換され更に「file.c」が 付け加わりますから結果として「cat file.a file.b file.c」という コマンドになります。 ところで時々直前に実行したコマンドをもう一度実行したい場合があります。 この場合には

    % !!

のように「!」を2回打つと直前のコマンドが再実行されます。 この場合も「!!」の後に文字を付けることができます。 例えば

    % cd
    % ls week07 
    % !!/somefile
    % !!/file.a

です。 この場合、最後のコマンドは「ls week07/somefile/file.a」と変換された後に 実行されます。

今までの例は実行されたコマンドの全てを再実行に使いましたがコマンドの 一部だけを再利用する場合もあります。 その一例はコマンドの最後の単語に変換される「!$」です。

    % cd week07
    % cd somefile
    % !cp
    % emacs !$ &

この例では最後から2番目のコマンドが「cp file.a file.a2」となり、 最後のコマンドは「emacs file.a2 &」となります。

以上シェルのコマンド行の置換とヒストリー機能の一部を見ましたが 理解できたでしょうか。

今週の最初に戻る

Cシェルの機能2

Cシェルに限らず多くのシェルではシェル変数が使用できます。 Cシェルの場合には2種類の変数の設定方法があります。 その2種類とは set コマンドで設定するものと setenv コマンドで 設定するものです。 まず set コマンドで設定する変数を見てみましょう。 既に設定されている変数はオプション無しの set コマンドで見えます。

    % set 

いくつかの変数とその値が表示されましたね。 わかり易いものとしては

これらの変数は主にオペレーティングシステムやコマンドが参照しますが、 皆さん自身が定義し使用することもできます。

    % set myvar='The variable I set.'
    % echo $myvar

シェル変数を設定する時には set コマンドで変数名=値とすればいいわけです。 これを使用する時には定義した変数名に「$」を付けて参照します。 この例ではあまりシェル変数を使うご利益がわかりませんが、このように シェル変数を定義し使用できることがわかったことと思います。

次に setenv コマンドで設定する変数を見てみましょう。 既に設定されている変数を見る時にはオプション無しの setenv コマンドが 使えます。

    % setenv

色々な変数が見えますが set コマンドでも定義されていた変数のいくつかが (大文字小文字の違いはありますが)やはり定義されていますね。 この setenv で見えるシェル変数も皆さんが定義し使用できます。

    % setenv MYVAR 'Another variable I set.'
    % printenv MYVAR
    % echo $MYVAR
    % echo $myvar

この場合にはシェル変数の定義は setenv コマンドに続けてシェル変数を書き 空白を空けてその値を与えています。 参照する場合は set コマンドで設定したシェル変数と同様に変数名に「$」 を付けます。 printenv コマンドはある特定のシェル変数の値を表示します。 最後のコマンドでわかるように set コマンドで設定する変数と setenv で 設定する変数は別物です(大文字と小文字が違うせいもありますが)。 もし set コマンドと setenv で同じ変数を設定した場合には set で 設定した変数が優先されるようです。 このような変数の重複を避けるために慣習として set で設定する変数名は小文字に setenv で設定する変数名は大文字にします。

これまで set と setenv で設定する変数は同じようなものとして説明して きましたが、正確には set で設定されるのはシェル変数で setenv で 設定されるものはシェル変数であるとともに環境変数でもあります。 環境変数はあるシェルから新しいシェルを開いた場合やシェルからコマンドを 立ち上げた場合に新しいシェルやコマンドに引き継がれる点がただのシェル変数と 違いますが、この授業の中ではこの違いをあまり意識する必要はないでしょう。

では簡単なシェル変数の使い方の例とシェルのコマンドの中でシェル変数 を使う例を見てみましょう。

    % set email='asakaguc@sci.hiroshima-u.ac.jp'
    % echo $email
    % set semia2='/home/users/asakaguc/semia2.www'
    % ls $semia2
    % echo $semia2
    % set par='yes'
    % if ( $par == 'yes' ) echo par is yes
    % set par='no'
    % if ( $par == 'yes' ) echo par is yes

最初の例では比較的長い文字列をシェル変数に与えていますね。 このように長い文字列や何度も打ち込む必要のある文字列の打ち間違いを 避けるためにシェル変数が使えます。 2番目の例では if という条件分岐をするシェルコマンドの中でシェル変数を 参照しています。 このようにシェル変数でコマンドの動作をコントロールできます。 上に挙げた例はあまり良くないのでシェル変数の有り難さがあまりわかり ませんが、皆さんがUNIXシステムを使いこなせるようになると シェル変数の有り難さがもっとわかってくると思います。

今週の最初に戻る

tcsh の機能

まず tcsh に移ります。 シェルはコマンドの一種ですから通常のコマンドを実行するようにシェルを 実行します。

    % tcsh

tcsh に移ると少しプロンプトが変わりましたね。 まあそれは気にせずに以下のコマンドを打ってみて下さい。

    % ls 
    % pwd
    % who
    % cat file.a file.c

ここまで打った段階で「上向き矢印」キーを4回程度押してみて下さい。 矢印キーを打つ毎に既に実行したコマンドが出てきましたね。 また「上向き矢印」キーを押し過ぎた場合は「下向き矢印」キーで戻れます。 これは Cシェルのヒストリー機能を「!」などで参照しないでも使えることを 意味します。 また出てきた実行済みコマンドは編集できます。 例えば ls コマンドのところでオプション -l を付け加え「ls -l」と 編集した後にリターンキーを打って実行してみて下さい。 更に今実行した「ls -l」コマンドに戻って Delete (DEL) または Back Space (BS) キーで「-l」を消去して「ls」としてからコマンドを実行してみて下さい。 今度は「cat file.a file.c」に戻り「file.a」と「file.c」の間までカーソルを 「右矢印」キーと「左矢印」キーで持っていき「file.b」を挿入して最終的に 「cat file.a file.b file.c」としてから実行して下さい。 このように tcsh では実行したコマンドの再利用がし易くなっています。

もう一つの tcsh に特徴的な機能としてファイル名の TAB 補間があります。 まずは以下のコマンドを実行して下さい。

    % cp file.a xfile.a
    % cp file.a ffff.a

この後に「cat xfile.a」というコマンドを実行したいとします。 そこで「cat x」まで打ったところで TAB キーを押して下さい。 そうすると tcsh がファイル名を補間してくれたはずです。 これで長々としたファイル名を打たなくてもいいですね。 では今度は「cat ffff.a」というコマンドを実行したいとします。 この場合に「cat f」まで打った段階で TAB を打つとビープ音が 鳴って補間してくれません。 これは f で始まるファイル名が複数あるためです。 この場合にはもう一文字打って「cat ff」とすると目的のファイル名に 補間されます。 では「cat fi」で TAB を打つとどうなるでしょうか。 この場合には「cat file.」まで補間されてビープ音が鳴ります。 これ以上は複数のファイルがあるので tcsh がどのファイルか判断できない のですが、とりあえずわかる部分までは補間してくれたわけです。 tcsh を使いこなすと一つのディレクトリーに沢山のファイルがある場合など この TAB 補間が非常に便利なことがわかると思います。

tcsh から csh に戻るには exit コマンドを実行して下さい。

今週の最初に戻る

今週の課題

今週はシェルの機能としてワイルドカードの使い方を学習しました。 そこでワイルドカードに関する課題です。 今週作った manyfile ディレクトリーにあるファイルの中から以下の条件全てに 合うファイルだけをリストアップするコマンドを(基本的には ls コマンドを 使って)考えて下さい。

皆さんが考えたコマンドとその実行結果を同時に教官に送るには以下の コマンドを試して下さい。

    % ( echo '考えたコマンド'; 考えたコマンド ) | \
      mail -s 'サブジェクト' asakaguc@sci.hiroshima-u.ac.jp u0872000

echo に続く「考えたコマンド」は必ずクオーテーションマーク「'」で囲って ください。 このコマンドがうまくいかない場合には2つのメイルに分けても結構です。

シェル変数の使い方も学習しましたね。 それでは以下のような操作をシェル変数を使って行なうコマンドを (数行のコマンドになります)考えて実行し思い通りの結果になることを 確認した後にそのコマンドをメイルで教官に送って下さい。

これで今週の課題は終了です。

今週の最初に戻る