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版の違いを把握しておくと切り分けが早くなる。