2008年1月22日火曜日

Macportsのcoreutilsコマンド群はなんでも「g」から始まる

CoreutilsはcatやlsといったUNIX上の基本的なコマンドを集めたGNUのパッケージである。これをMacPortsからインストールしたからGNUのコマンド群が使えるようになるぞ、と思っているとハマることになる。Coreutilsを普通にインストールしても、「ls」はインストールされないのである。

% port file coreutils
/opt/local/var/macports/sources/rsync.macports.org/release/ports/sysutils/coreutils/Portfile <- coreutilsはインストールされている
% ls --help
ls: illegal option -- - <- GNUのlsではない
usage: ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [file ...]
% which ls
/bin/ls <- OS標準のlsが使われている
%
実はlsはglsという名前でインストールされている。cp、mv、df、cat、odもそれぞれgcp、gmv、gdf、gcat、godという名前で入る(godって……)。おわかりのとおり、コマンド全部が「g」から始まるようになっている。

これを回避する方法は一応ある。こうやってcoreutilsをインストールすれば余計なgがつかない。

% sudo port install coreutils +with_default_names
ただこれはあまり推奨されていないようで、おすすめはaliasを設定することだそうだ(下の方にalias一覧をつけました)。


以下は蛇足。

これはMacports側の設定で「すべてにgをつけるべし」という設定が意図的にされているからである。

configure.args  --program-prefix=g \
--disable-nls
つい先日MacPortsのメーリングリストでも「lsはlsとして、gをつけない普通の名前で/opt/local/binに入れるようにしませんか」という提案がなされたのだが(ソース)、「既存のシェルスクリプトはOS標準の(BSD系の)lsを想定して書かれているから動かなくなったら困る」という理由で却下されている。

明確なソースが示されていないので実際どのくらいの影響が出るのかは知らないが、記憶をたどるとこの議論、ずっと前から存在する。FreeBSDのportsでも長い間lsはglsとしてインストールされてきた。古いものはあまり確認できないが、少なくとも2000年時点のfileutilsはそうである(ソース)。

個人的にはlsをls以外の名前で呼ぶことはしたくないし、glsなんていちいち打つ人がいるとも思えない。aliasを設定すれば良いというのはもっともらしく聞こえるが、不出来なシェルスクリプトのつけをユーザに回しているだけという気もする。

どちらのlsでも動くシェルスクリプトを作る方法はあとで考えることにして、とりあえずaliasを設定した。

alias base64=gbase64
alias basename=gbasename
alias cat=gcat
alias chgrp=gchgrp
alias chmod=gchmod
alias chown=gchown
alias chroot=gchroot
alias cksum=gcksum
alias comm=gcomm
alias cp=gcp
alias csplit=gcsplit
alias cut=gcut
alias date=gdate
alias dd=gdd
alias df=gdf
alias dir=gdir
alias dircolors=gdircolors
alias dirname=gdirname
alias du=gdu
alias echo=gecho
alias env=genv
alias expand=gexpand
alias expr=gexpr
alias factor=gfactor
alias false=gfalse
alias fmt=gfmt
alias fold=gfold
alias groups=ggroups
alias head=ghead
alias hostid=ghostid
alias hostname=ghostname
alias id=gid
alias install=ginstall
alias join=gjoin
alias kill=gkill
alias link=glink
alias ln=gln
alias logname=glogname
alias ls='gls -F'
alias md5sum=gmd5sum
alias mkdir=gmkdir
alias mkfifo=gmkfifo
alias mknod=gmknod
alias mv=gmv
alias nice=gnice
alias nl=gnl
alias nohup=gnohup
alias od=god
alias paste=gpaste
alias pathchk=gpathchk
alias pinky=gpinky
alias pr=gpr
alias printenv=gprintenv
alias printf=gprintf
alias ptx=gptx
alias pwd=gpwd
alias readlink=greadlink
alias rm=grm
alias rmdir=grmdir
alias seq=gseq
alias sha1sum=gsha1sum
alias sha224sum=gsha224sum
alias sha256sum=gsha256sum
alias sha384sum=gsha384sum
alias sha512sum=gsha512sum
alias shred=gshred
alias shuf=gshuf
alias sleep=gsleep
alias sort=gsort
alias split=gsplit
alias stat=gstat
alias stty=gstty
alias su=gsu
alias sum=gsum
alias sync=gsync
alias tac=gtac
alias tail=gtail
alias tee=gtee
alias test=gtest
alias touch=gtouch
alias tr=gtr
alias true=gtrue
alias tsort=gtsort
alias tty=gtty
alias uname=guname
alias unexpand=gunexpand
alias uniq=guniq
alias unlink=gunlink
alias uptime=guptime
alias users=gusers
alias vdir=gvdir
alias wc=gwc
alias who=gwho
alias whoami=gwhoami
alias yes=gyes
ちなみに以上はワンライナーで作った。
% port contents coreutils | perl -nle 'print "alias $1=g$1" if m{/opt/local/bin/g(\w+)}'
alias base64=gbase64
alias basename=gbasename
alias cat=gcat
alias chgrp=gchgrp
(略)
%
例外はlsで、「gls -F」にaliasした。

2 件のコメント:

  1. 参考になりました。
    ありがとうございます。

    返信削除
  2. 現在は /opt/local/libexec/gnubin の中に g なしの symbolic link が置かれるようになってます. coreutils のインストール時に説明が表示されます.

    返信削除