pecoなどのCLIツールを使用する際に、Linuxでは標準的なtacコマンドがmacOSでは利用できずエラーが発生することがある。この記事では、macOSでtacコマンドを使えるようにするための設定手順を記録する。
検証環境
- macOS
- Homebrew導入済み
- bash または zsh
tacコマンドとは
tacコマンドは、ファイルの内容を行単位で逆順に出力するLinuxの標準コマンドである。catコマンドの逆の動作を行うため、"tac"(catの逆綴り)という名前が付けられている。主にログファイルの最新エントリから順に表示したい場合や、履歴検索ツールでの逆順処理に使用される。
macOSでのtacコマンド不在問題
macOSでpecoなどのツールを使用する際に、以下のようなエラーが発生する場合がある:
-bash: tac: command not found
これは、macOSのBSD系ユーティリティにはGNU系のtacコマンドが含まれていないことが原因である。多くのLinux環境で当然のように使用されているコマンドであるため、LinuxからmacOSに移行した際によく遭遇する問題となっている。
coreutilsパッケージによる解決
最も確実で標準的な解決方法は、GNU coreutilsパッケージをHomebrewでインストールすることである。GNU coreutilsは、Linux環境で使用されている基本的なコマンド群をmacOSでも利用できるようにするパッケージである。
brew install coreutils
このインストールにより、GNU版の各種コマンドがgプレフィックス付きで利用可能になる。tacコマンドの場合はgtacとして使用できるようになる。
インストール後の動作確認:
echo -e "first\nsecond\nthird" | gtac
# 出力:
# third
# second
# first
エイリアスによる透過的な利用
gtacコマンドが使用できるようになったが、既存のスクリプトや設定でtacとして呼び出される場合に対応するため、エイリアスを設定する必要がある。使用しているシェルの設定ファイルにエイリアスを追加することで、tacコマンドをgtacに自動的に変換できる。
bashを使用している場合は~/.bashrcまたは~/.bash_profileに、zshを使用している場合は~/.zshrcに以下の設定を追加する:
alias tac='gtac'
設定を反映させるため、設定ファイルを再読み込みするか、新しいターミナルセッションを開始する:
# bashの場合
source ~/.bashrc
# zshの場合
source ~/.zshrc
設定の確認
エイリアス設定後、tacコマンドが正常に動作することを確認する:
# tacコマンドのテスト
echo -e "line1\nline2\nline3" | tac
# 期待される出力:
# line3
# line2
# line1
また、エイリアスが正しく設定されているかはaliasコマンドで確認できる:
alias | grep tac
# 出力: alias tac='gtac'
pecoでの履歴検索への適用
この設定により、pecoを使用した履歴検索でtacコマンドが正常に動作するようになる。一般的なpeco設定では、コマンド履歴を逆順で表示するためにtacが使用されており、以下のような設定が機能するようになる:
# 例:pecoを使った履歴検索の設定
function peco-select-history() {
local tac
if which tac > /dev/null; then
tac="tac"
elif which tail > /dev/null; then
tac="tail -r"
fi
BUFFER=$(history -n 1 | eval $tac | peco --query "$LBUFFER")
CURSOR=$#BUFFER
zle clear-screen
}
まとめ
macOSでのtacコマンド不在問題は、GNU coreutilsパッケージのインストールとエイリアス設定により解決できる。この設定により、Linux環境で作成されたスクリプトやツール設定をmacOSでもそのまま利用できるようになる。特にpecoやその他のCLIツールを使用する開発環境において、この設定は必須といえる。同様の手法は、GNU系の他のコマンド(gls、ggrepなど)にも適用でき、Linux環境との互換性を高めることができる。