唐突だが、どの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を使い分けている場合には、ぜひとも覚えておこう。それが『漢道』である。