root で zsh

root で zsh 使うと command completion がなぜか失敗して portupgrade で package 名を補完できないので、自分で /var/db/pkg を参照して補完リストに突っ込むようにしてみた。(どうも出来るマシンと出来ないマシンがある?)

/root/.zshrc にこんな行を書き、

compdef -d portupgrade
pkg_list=(`perl /root/listpkg.pl`)
compctl -k pkg_list portupgrade

/root/listpkg.pl を書く。

#!/usr/local/bin/perl

use File::Glob;

my @list = File::Glob::bsd_glob('/var/db/pkg/*');

for my $pkg (@list) {
    next if $pkg =~ /pkgdb\.db/o;
    my $pkg_name = ( split m!/!, $pkg )[-1];

    my @splits = split /\-/, $pkg_name;
    pop @splits;

    printf "%s\n", join( '-', @splits );
}

うーん、出来るようにはなったけど、これはなんとなく危険かつダサいなあ。そもそも root で zsh なんか使おうとするのが間違ってるのか。