理系学生日記

おまえはいつまで学生気分なのか

MacでBSD版のコマンドを使う

自分のMacでは動くのに他の人のMacでは動かないというスクリプトを組んでしまいました。 具体的には、以下のようなchmodの実行が動作したりしなかったりした。

$ chmod +w -R ${workdir}

これは確かにコマンドオプションの順が不自然なのでぼくが埋め込んだバグとしてchmod -R +w ${workdir}に修正しました。 この挙動の差異が何に起因したのかというと、BSD版とGNU版のchmodの違いによるものです。

Macでは多くのコマンドとしてBSD版のものがデフォルトでインストールされています。 Linux周りのコマンドに慣れているとずいぶんとオプション周りに戸惑うことが多いので、そういった場合はGNU版をインストールします。

$ brew install coreutils
$ brew install findutils

デフォルトだと先頭にgがついた形でコマンドが用意されています。

ls /usr/local/opt/coreutils/bin/
 ./         gbasename*   gcomm*        gdirname*   gfold*      gln*        gnice*      gpr*         gruncon*      gsleep*    gtail*       gtty*        gwho*      realpath@    stdbuf@
 ../        gbasenc*     gcp*          gdu*        ggroups*    glogname*   gnl*        gprintenv*   gseq*         gsort*     gtee*        guname*      gwhoami*   runcon@      tac@
 b2sum@     gcat*        gcsplit*      gecho*      ghead*      gls*        gnohup*     gprintf*     gsha1sum*     gsplit*    gtest*       gunexpand*   gyes*      sha1sum@     timeout@
 base32@    gchcon*      gcut*         genv*       ghostid*    gmd5sum*    gnproc*     gptx*        gsha224sum*   gstat*     gtimeout*    guniq*       hostid@    sha224sum@   truncate@
 chcon@     gchgrp*      gdate*        gexpand*    gid*        gmkdir*     gnumfmt*    gpwd*        gsha256sum*   gstdbuf*   gtouch*      gunlink*     md5sum@    sha256sum@
'g['*       gchmod*      gdd*          gexpr*      ginstall*   gmkfifo*    god*        greadlink*   gsha384sum*   gstty*     gtr*         guptime*     nproc@     sha384sum@
 gb2sum*    gchown*      gdf*          gfactor*    gjoin*      gmknod*     gpaste*     grealpath*   gsha512sum*   gsum*      gtrue*       gusers*      numfmt@    sha512sum@
 gbase32*   gchroot*     gdir*         gfalse*     gkill*      gmktemp*    gpathchk*   grm*         gshred*       gsync*     gtruncate*   gvdir*       pinky@     shred@
 gbase64*   gcksum*      gdircolors*   gfmt*       glink*      gmv*        gpinky*     grmdir*      gshuf*        gtac*      gtsort*      gwc*         ptx@       shuf@

普段使いするためには、gnubin配下にパスを通せば良いでしょう。

path=(
    $(brew --prefix coreutils)/libexec/gnubin(N-/)
    $(brew --prefix findutils)/libexec/gnubin(N-/)
    $HOME/bin
    $path
)