水底

ScalaとかC#とかk8sとか

GNU系とBSD系のコマンドで特によくハマるやつ

「あなたのシェルスクリプト、ポータビリティありますか?」

まぁ個人的によーーーくハマる、というかほぼほぼBSD環境やらかしがちなやつのまとめです。バージョンによっては別の挙動をすることも多いので注意。

grep

GNU

  • -PPerl互換の正規表現が使える。個人的に戻り読み・先読みを使うことが多々あるので無いと死ぬ
    • e.g., 例えばHTMLタグの中身を抜き出すとき: echo -n '<h1>foo</h1>' | grep -oP '(?<=<h1>).+(?=</h1>)'
  • 単純に実行速度が速い

BSD

  • 特にいいところが思い浮かばなかった

sed

GNU

  • バックスラッシュでメタ文字をエスケープする or -E/-r オプションで正規表現が使える
  • -i オプション (in-placeオプション) のバックアップファイルを省略できる (≒オプション引数なしだとバックアップファイルは作られない)

BSD

  • -E オプションで正規表現が使える
  • -i オプション (in-placeオプション) のバックアップファイルを省略できない (≒オプション引数なしのつもりで実行すると変なファイルが出来上がる)
    • e.g., sed -i -e 's/foo/bar/g' -e 's/hoge/piyo/g' some.txt -> some.txt-e という未知のファイルが発生

xargs

GNU

  • 対象が空だったときでも1回実行される。なぜ…
    • echo -n '' | xargs echo foo -> foo

BSD

  • 対象が空だったときは1回も実行されない
  • -I オプション (プレースホルダオプション) を使うとき、実行するコマンドが256bytes以上になるとプレースホルダが失敗する (!!?)

base64

GNU

  • デコードは -d オプションで

BSD

  • デコードは -D オプションで

まとめ

ほぼほぼGNUがいい…BSD (最近はほぼmacOS) つらい…