【コラム】

OS X ハッキング!

54 究極のシェル「zsh」を知る(その1)

    海上 忍  [2003/05/30]

    今週、iTunes4がv4.0.1(Build117)にマイナーバージョンアップされた。著作権問題が指摘された共有機能に制限が加えられたこと以外、目立った変更点はないようだ。これで自宅のMacに蓄えたサウンドライブラリを出先から楽しむことはできなくなったが、そもそも外出する機会が少ないから関係ないか…トホホ。

    さて今回は、OS Xに標準で収録されているシェル「zsh」を取り上げてみたい。シェルは"慣れ"が重要な意味を持つプログラムであり、機能の多さがすべてとは言えないが、zshには他のシェルの追随を許さないほどマニアックな機能が満載されている。"究極のシェル"という呼称は伊達ではないのだ。

    zshをTerminalで使用するときには、通常のコマンドと同様に「zsh」と実行すればOK。これでzshの機能を利用できるが、毎回zshを利用するのならば環境設定を変更しておこう。メニューバーから[ターミナル]→[環境設定...]を選択し、表示されたダイアログボックスの[このコマンドを実行する]ラジオボタンを有効にしてから空欄に「/bin/zsh」と入力すればOK。これで、次回Terminalを起動したときにはzshが使用される。

    なお、zshの起動時には、.zshenvや.zprofile、.zshrcといったログインスクリプトの有無が確認される。zshを常用する場合、ログインスクリプトを自分が使いやすいよう編集することは必須の作業となるが、その前にzshの主要な機能について説明しておきたい。まずは「賢いファイルの削除方法」から始めてみよう。

    ・ファイルの削除

    拡張子を条件にファイルを削除するときには、findコマンドとrmコマンドを組み合わせることがオーソドックスな方法といえる。たとえば、カレントディレクトリ以下を削除の対象範囲とするとき、拡張子「*.aux」のファイルを1つ1つ確認しながら削除するには、「find . -name '*.aux' -ok rm {} \;」といった要領でコマンドを実行することになるはずだ。

    しかし、zshならfindコマンドを使う必要はない。ディレクトリ名部分にワイルドカード「**」を指定すれば、カレントディレクトリ以下に存在するディレクトリ名を再帰的に補完してくれるのだ。つまり、前述のfindコマンドとまったく同じ処理を行う場合には、以下に示すとおりrmコマンドを実行すればいい。

    ○拡張子を条件にファイルを削除する

    % rm -i **/*.aux

    ・賢いファイル名の指定方法

    zshでは、ファイル/ディレクトリ名を柔軟に表現できる。機能の組み合わせ方次第では、かなりアクロバティックなことも可能だが、ここでは基本的な使い方をいくつか紹介するに留めたい。

    まずは複数の条件をもとにファイルリストを表示する方法について。「.log」と「.aux」という2種類の拡張子を条件にする場合、パッと思い浮かぶのは「ls *.log *.aux」というコマンドラインだが、zshでそのように記述するのは野暮というもの。zshでは、候補を「( )」でグルーピングし、その間を「|」で区切れば、AまたはB…という条件で検索できる。

    ○拡張子「.log」と「.aux」のファイルを表示する

    % ls *.(log|aux)

    zshに予約された特殊文字(下表参照)を利用すると、属性情報を条件にファイルリストを表示することも可能だ。たとえば、シンボリックリンクのみ表示するには、次のようにコマンドを実行すればいい。実行形式のファイルならば「*(x)」、カレントユーザが所有するファイルならば「*(U)」といった要領だ。

    ○シンボリックリンクを一覧表示する

    % ls *(@)

    特定のファイルを例外として扱う機能も用意されている。「~」で始まる文字列を指定すれば、他の条件に一致していても除外することができるのだ。たとえば、前述した「ls *.(log|aux)」を実行するとき、以下のようにコマンドを実行すると、ファイル名が「mac」から始まるファイルを除いた拡張子「.log」と「.aux」のファイルが表示されることになる。

    なお、zshのデフォルトでは、この機能を使用するためのオプション(EXTENDED_GLOB)が無効になっている。「setopt EXTENDED_GLOB」とし、機能を有効にしてからコマンドを実行しよう。

    ○拡張子「.log」と「.aux」のファイルを表示する(先頭が「mac」から始まるファイルを除く)

    % ls *.(log|aux)~mac*

    ○zshに予約された主な特殊記号

    記号意味
    /ディレクトリ
    .通常のファイル
    @シンボリックリンク
    *ディレクトリ以外の実行可能なファイル
    r読み取り可能なファイル
    w書き込み可能なファイル
    x実行形式のファイル
    Uカレントユーザが所有するファイル
    u[ユーザ名]指定したユーザが所有するファイル
    ssetuidされたファイル
    ~条件から除外する
    ^以降の指定を否定する
    -次の指定にシンボリックリンクを含む

    バックナンバー
    http://pcweb.mycom.co.jp/column/osx.html

    新着記事

    特設サイトの情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      マイナビニュースマガジン