macOS標準のteeはBSD版
macOSに標準搭載されている/usr/bin/teeはBSD版であり、対応オプションは-aと-iのみ。
$ /usr/bin/tee --version
tee: illegal option -- -
usage: tee [-ai] [file ...]
--versionのような長いオプション(ロングオプション)自体に対応していない。
HomebrewでGNU coreutils版を入れると挙動が変わる
brew install coreutilsでGNU coreutilsをインストールすると、GNU版のteeが使えるようになる。
$ brew install coreutils
$ /opt/homebrew/opt/coreutils/libexec/gnubin/tee --version
tee (GNU coreutils) 9.9
GNU coreutils版は-a/-iに加えて、パイプ向けの-pや書き込みエラー時の挙動を制御する--output-errorなど、ロングオプションを含む多くのオプションに対応している。
PATHの設定によってはteeコマンドが置き換わる
coreutilsのgnubinディレクトリをPATHの先頭に追加していると、teeコマンド自体がGNU版に置き換わる。
$ echo 'export PATH="/opt/homebrew/opt/coreutils/libexec/gnubin:$PATH"' >> ~/.zshrc
$ type tee
tee is /opt/homebrew/opt/coreutils/libexec/gnubin/tee
意図せずGNU版が使われていると、他のmacユーザーの環境では動かないオプション(-pや--output-error)入りのコマンドを共有してしまうことがある。シェルスクリプトなど複数環境で動かすものにはBSD版でも動くオプションだけを使うほうが安全。
用途
man teeで確認できる説明は、そのシステムで実際に使われているteeのものである。GNU版に慣れていると-a/-i以外のオプションが使えず戸惑いやすいため、BSD版とGNU版の違いを把握しておくと切り分けが早くなる。
\第一線のプログラマーの行動原理を学べる!/
