唐突だが、どのOSもサクサクっと使いこなしてこそ『漢道』である。そんなわけで、今回はOSごとに異なる補完設定を行う方法として、mountコマンドの補完設定について取り上げる。つまり、これをマスターして「zshだけインストールしておけば、あとはどのOSでも同じ」…という具合にしておきたいわけだ。そのためには補完設定やら設定内容などをOSごとに分岐させる必要がある。例としてはmountコマンドで使われているファイルシステムタイプの設定がなかなか分かりやすいので、ここで紹介しておこう。

ファイルシステムタイプはOSによって異なる

ディスク装置やUSBメモリといった周辺機器や外部記憶装置をマウントするコマンドがmountである。マウント時には対象とするデバイスのファイルシステムタイプやマウントの種類を-tオプションで指定する(ただしSolarisの場合は-oオプションで指定するようだ)。ここで指定できるファイルシステムタイプは、OSごとに違っている。

ということで、とりあえずどう違うか実行してみる。FreeBSDならプロンプト1.1のようになる。若干現状と食い違っているが、まぁこれは補完設定ファイルがちょいと現状に追いついてないだけだ。

プロンプト1.1 FreeBSD 7-currentでmountコマンドの補完を実行した場合

% mount -t [ここでタブキーを押す]
cd9660  ext2fs  kernfs     mfs    nfs   null  portal  std  ufs   union
devfs   fdesc   linprocfs  msdos  ntfs  nwfs  procfs  udf  umap       

OS Xで実行するとプロンプト1.2のように、ufsだけが補完される。

プロンプト1.2 OS Xで同じことをした場合

% mount -t [ここでタブキーを押す]
  ↓
% mount -t ufs

Ubuntu 7.04で補完するとプロンプト1.3のとおりだ。

プロンプト1.3 Ubuntu 7.04で実行した場合

% mount -t [ここでタブキーを押す]
adfs         cramfs       ext3     hfs        mqueue  ramfs       sockfs  ufs
bdev         debugfs      fuse     hpfs       ntfs    reiserfs    swap    vxfs
bfs          devpts       fuseblk  inotifyfs  pipefs  romfs       sysfs   xfs
binfmt_misc  eventpollfs  fusectl  iso9660    proc    rootfs      tmpfs   xiafs
cpuset       ext2         futexfs  minix      qnx4    securityfs  udf

以上から、OSごとに補完内容が切り分けられていることが分かる。それでは、この設定を調べてみよう。

_file_systems - OSごとにファイルシステムタイプを設定

ファイルシステムタイプについてはzsh/4.3.2/functions/Completion/Unix/_file_systemsで設定されている。これはコマンド補完設定ファイルではなく、コマンド補完設定で使える変数を設定するといったものだ。リスト2.1のファイルの内容を掲載する。

リスト2.1 zsh/4.3.2/functions/Completion/Unix/_file_systems - OSごとにファイルシステムが設定されている

#autoload

local expl fss

case $OSTYPE in
  aix*) fss=( jfs nfs cdrfs ) ;;
  irix*) fss=( efs proc fd nfs iso9660 dos hfs cachefs xfs ) ;;
  linux*)
    typeset -aU fss
    fss=( adfs bfs cramfs ext2 ext3 hfs hpfs iso9660 minix ntfs qnx4
          reiserfs romfs swap udf ufs vxfs xfs xiafs )
    [[ -r /proc/filesystems ]] &&
        fss+=( ${$(</proc/filesystems)#nodev} )
    [[ -r /etc/filesystems ]] &&
        fss+=( ${$(</etc/filesystems)#\*} )
  ;;
  osf*) fss=( advfs ufs nfs mfs cdfs ) ;;
  solaris*) fss=( ufs nfs hsfs s5fs pcfs cachefs tmpfs ) ;;
  freebsd*|dragonfly*)
    fss=( cd9660 devfs ext2fs fdesc kernfs linprocfs mfs msdos nfs 
          ntfs null nwfs portal procfs std udf ufs umap union )
  ;;
  *)
    # default for all other systems
    fss=( ufs )
  ;;
esac

_wanted fstypes expl 'file system type' compadd "$@" -M 'L:|no=' -a "$@" - fs

コマンド補完設定ではないので、1行目が「#autoload」になっていることが分かるだろう。そして設定内容は$OSTYPE変数の内容に従ってcase構文で分岐して設定している。これがOS別の設定方法の基本である。自分の使っているzshで「echo $OSTYPE」を実行してどんな値が設定されているかチェックしてみよう(リスト2.2)。

リスト2.2 OSごとの分岐処理を整理すると…

case $OSTYPE in
  aix*)
    AIXの設定
    ;;
  irix*)
    IRIXの設定
    ;;
  linux*)
    Linuxの設定
    ;;
  osf*)
    OSFの設定
    ;;
  solaris*)
    Solarisの設定
    ;;
  freebsd*|dragonfly*)
    FreeBSD / DragonFly BSDの設定
    ;;
  *)
    それ以外のOSの設定
  ;;
esac

リスト2.1の最後の行で「_wanted fstypes expl 'file system type' compadd "$@" -M 'L:|no=' -a "$@" - fss 」としているところにも注目したい。これで「:file system type」を使ってファイルシステムタイプ一覧にアクセスできるようになるという寸法だ。

mountコマンドの補完設定で「:file system type」を使用

あとはコマンド補完設定ファイルで設定されたファイルシステムタイプ一覧を使えばよい。例えばmountコマンドならリスト3.1のようになる。以下の内容はファイルシステムタイプに関する部分だけを抜き出したものだ。

リスト3.1 zsh/4.3.2/functions/Completion/Unix/_mount - mountコマンドの補完設定でファイルシステム設定が使われている

#compdef mount umount

case "$OSTYPE" in
aix*)

    '-t[specify file system type]:file system type:_file_systems'

irix*)

    '-t[specify file system type]:file system type:_file_systems'

linux*)

    '(-V -h)-t[specify file system type]:file system type:->fslist'

osf*)

    '-t[specify file system type]:file system type:_file_systems'

solaris*)

    '(-p -v)-o[specify file system options]:file system option:->fsopt'

*freebsd*|dragonfly*)

    '-t[specify file system type]:file system type:->fslist'

*)

    '-t[specify file system type]:file system type:_file_systems'

esac

mountコマンドは-t以外のオプションもOSごとに違っているので、こちらでも補完設定はOSごとに分岐している。しかしながらすでに「:file system type:_file_systems」で参照する内容はOSごとに異なる内容が設定されているので、OSごとの補完候補が表示されるわけだ。

$OSTYPEでOSごとに処理を分岐するというのが設定の基本である。いくつものOSを使い分けている場合には、ぜひとも覚えておこう。それが『漢道』である。