MENU

macOSでtacコマンドを使えるようにする設定方法

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系の他のコマンド(glsggrepなど)にも適用でき、Linux環境との互換性を高めることができる。

目次