私が普段使用するmacOSでは、コマンドラインツールのほとんどをHomebrewというパッケージマネージャで導入・管理しています1。もともとmacOSに同梱されているものを除いては、本当に大半のコマンドラインツールをHomebrewで管理しているので、私が直接利用するため、もしくは利用したいプログラムの依存関係で導入されたツールは
$ brew list
を叩くことにより、そのほぼすべてを一覧にすることができます。このようにHomebrewで導入されたツールはずいぶんと増えてきて、その数は今では170を超えました。そのすべての詳細を把握することは困難ですが、なんとなく「自分のパソコンに導入されているツールにどんなものがあるのか、一応は把握しておきたい」という気持ちになったので、簡単に調べられる範囲で手許に導入されているコマンドラインツールについてカタログ化してみようと思います。
ちなみにですが、このような調査を行う際にはHomebrewの機能を用いて
$ brew info <formula>
によってフォーミュラの基本情報を表示したり
$ brew home <formula>
で各フォーミュラの公式ホームページ2にアクセスしたりすると捗ります。また、フォーミュラ間の依存関係を調べるにはbrew depsとbrew usesが使えます。これらのコマンドについては以下のブログ記事に詳しいです:
afflib
- Advanced Forensic Format Library
- https://github.com/sshock/AFFLIBv3
AFF (Advanced Forensic Format) というのはオープンで拡張可能なディスクイメージ(と関連するメタデータ)を格納するファイルフォーマットのようです。したがって、AFFLIBv3はAFF形式のファイルを扱うためのライブラリ(ユーティリティ)でしょう。
このFormulaによってインストールされるバイナリはかなりたくさんあります。各1行で説明すると:
- affcat: イメージファイルの内容を標準出力に表示
- affcompare: AFF/ISOファイルの中身を比較
- affconvert: RAWファイルをAFFファイルに変換(逆変換も可能)
- affcopy: AFFファイルをコピー(同時に内容の並べ替えや再圧縮を行う?)
- affcrypto: 暗号化関連の操作を行う(クラック機能まである)
- affdiskprint: AFF構造のdiskprint3 を表示
- affinfo: AFFファイルの情報を表示4
- affix: 破損AFFファイルの修復
- affrecover: AFFの破損ページを修復
- affsegment: セグメンテーションを取り扱うツール
- affsign: 各セグメントにサイン(電子署名)をする
- affstats: AFFファイルの統計情報を表示
- affuse: AFFコンテナにアクセスする
- affverify: 電子署名の検証
- affxml: AFFファイルの情報をXMLに出力する
余談ですが、そもそも私はAFFディスクイメージというものを使ったことも見たこともなかったので、これらのコマンドの動作確認をするためには無理やりAFFファイルを入手する必要がありました。affconvertを用いるとRAWファイルからAFFファイルを作成できるので、以下のようにすると空のtest.affファイルが手に入ります。
$ mkfile 1k test.raw
$ affconvert test.raw
convert test.raw --> test.aff
Converting page 0 of 0
md5: 0f343b0931126a20f133d67c2b018a3b
sha1: 60cacbf3d72e1e7834203da608037b1bf83b40e8
bytes converted: 1024
Total pages: 1 (1 compressed)
Conversion finished.
apr
- Apache Portable Runtime
- https://apr.apache.org/
Apache HTTP Server (httpd) のサポートライブラリで、様々なプラットフォームに対して共通のAPIを提供することを目的としたもの。C言語用のライブラリなので、CLIは特にないようです。
もともとApacheの内部ライブラリだったものを独立ライブラリに切り出したものらしく、かなり低レベルな機能(動的なメモリ確保やファイルIO、スレッドやプロセスなど)をプラットフォーム非依存なAPIで提供しているようで、クロスプラットフォームなシステムプログラミングをしたい人には便利そうですね。個人的には、興味や研究テーマの関係でこの頃は低レイヤを触る機会がなく、思えばC言語も学部2, 3年の実習で書いて以来全然使っていないです。最近人気のGoやRustでシステムプログラミング再入門をしたい気もしますが、そのぐらいの優先度だと他にもやりたいことがたくさんあり、時間がいくらあっても足りなそう……
Apache本体は当然として、バージョン管理システムのSubversionなどもこのライブラリに依存しているそうです。
apr-util
- Apache Portable Runtime Util
- https://apr.apache.org/
上述aprの同伴ライブラリ。具体的には、XMLを始めとするデータベース関連のインターフェースやURIパーサなどの追加機能を提供しているとのこと。ここまでくるとそこまで低レイヤという感じではないですね。
argon2
Argon2というのは2015年のパスワードハッシュコンテスト (PHC)で優勝したアルゴリズムだそうです。プロジェクトのREADMEによれば、このアルゴリズムには3種類のバリアントがあるらしく、それぞれ
- Argon2i: サイドチャネル攻撃耐性があるが、低速
- Argon2d: サイドチャネル攻撃耐性がない代わりに高速。GPUクラッキング攻撃に耐性あり
- Argon2id: 上記2種のコンビネーションで、いいとこ取り
という特徴をもっていると説明があります。
この実装はC言語用ライブラリ (libargon2) とCLI (argon2) の両方を提供しているようです。私の環境では、このライブラリを利用しているのはPHPのみのようでした。
aspcud
- A solver for package problems in CUDF format
- https://potassco.org/aspcud/
解集合プログラミング (ASP) に基づく実験的なパッケージ依存関係ソルバ。このソルバを利用するためには、依存関係はCommon Upgradability Description Format (CUDF) という形式で記述されている必要があるようです。詳細は原著論文を参照してください:
この実装はLinuxの著名なパッケージマネージャapt-getのバックエンドとして利用可能なようですが、デフォルトのソルバよりは低速とのこと。macOS向けのフォーミュラが存在するのは、一部のフォーミュラのビルドに際して必要だからと思われます。
aspell
- GNU Aspell
- http://aspell.net/
古典的なUNIX用スペルチェッカIspellの代替として開発されたスペルチェッカ。(La)TeXのコマンドを無視する機能もあるらしく、TeX Wikiにも記事がありました。
私個人はVimのスペルチェック機能をデフォルト設定で利用しているので、aspellを直接コマンドラインで叩く機会はないのですが、PHPなどが依存しているらしく手許にインストールされたようです。TeX Wikiによれば近年はHunspellというスペルチェッカの方がよく用いられるそうですが……
autoconf
- GNU Autoconf
- https://www.gnu.org/software/autoconf/
近年はまさにHomebrewのようなツールのおかげで、CやC++ で書かれたプロジェクトを自分の手で直接ビルドするという機会も減っていると思いますが、仮にそういうことをしようと思うと
$ ./configure
$ make
$ make install
という一連の儀式を行うと思います(Homebrewのログ出力を見れば、brewを使っても結局裏でそういうことは頻繁に行われているわけですが)。
例によって私は低レイヤプログラミングをすることがほぼないので使ったことはありませんが、autoscan・automake・autoconf等のコンボ(総称してautotoolsというらしい)でプロジェクトの配布用ファイル群を作るのは定石のようなので、一度ぐらい経験しておくべきかもしれませんね。
autopsy
私は最近NCISという米ドラマを視聴しているのですが、このドラマの主要キャラクタの1人が監察医なので“autopsy”(検死)という単語は頻繁に出てきます。なかなか洒落たネーミングです。
このプログラムはThe Sleuth Kitというフォレンジクス用コマンド群のGUIです。まったく導入した記憶がないですが、おそらくCTF用にインストールしたのだと思います。コマンドラインで
$ autopsy
を叩くとローカルサーバ(デフォルトではhttp://localhost:9999/autopsy)が立ち上がるので、ブラウザで開くと次のような画面になっており、GUI操作可能です:

調査プロジェクトを“case”(症例)と呼ぶなど、どこまでもこだわりが感じられますね。まぁ私はCTF等をやる際にはコマンドラインツールを使う気がするのでGUIの出番はあまりないと思いますが……
bash
- GNU Bash (Bourne-again shell)
- https://www.gnu.org/software/bash/
言わずとしれたシェルの1つです。私は普段zshを使っているので常用していないですが、macOS (10.13.6) のデフォルトシェルがbash 3.2系とかなり古いので、Homebrewで新しいものを入れています。
bastet
- Bastard Tetris
- http://fph.altervista.org/prog/bastet.html
コマンドラインで遊べるテトリスです。暇つぶしにはもってこいなのですが、私はテトリスは苦手でなかなかハイスコアが出せません……

binwalk
CTF界隈では定番らしいファームウェアイメージ解析ツールです。具体的なユースケースとしては、特定の動画や画像などのファイルに別のファイルが埋め込まれていないか解析・抽出することが挙げられます。詳しい使い方については、公式のWikiがとても充実しているようです:
実装言語はPythonで、CLIとしてもライブラリとしても利用できるプロジェクトとしてかなりしっかりとした作りになっていそうなので、そのようなプロダクトを自分で開発する際には参考にできそうです。
boost
- Boost C++ Libraries
- https://www.boost.org/
よく知られたC++ の先鋭的なライブラリです。世間にはBoostを解説した書籍やブログ記事が多数あるので、ここでは詳細の一切を省略しても構わないでしょう。
例によってbrew usesを使ってboostに依存するフォーミュラを調べると、かなり多くの有名プロジェクトが採用していることがわかって面白いです5:
$ brew uses --recursive --installed --include-build --include-optional boost
極めて個人的な所感としては、C++ 自体がかなり高機能な言語のはずなのに、それをさらに激しく拡張するライブラリとはなんとも恐ろしい…… 理想論はまた別ですが、現実には「よく使われる言語」というのは言語仕様そのものの善し悪しよりも、むしろ「資産」の多寡が影響する部分が大きく、なんだかんだ言われながらもCとかC++ とかPerlとかPythonとかTeXとかが至るところで使われているのは、要するにそういうことなんじゃないかと(おっとかなり話が逸れました)
brotli
BrotliはGoogleが開発したデータ圧縮アルゴリズムおよびその実装です。gzipよりも圧縮率が高く、また処理が高速であることを売りにしているようです。アルゴリズムとしてはLZ77とハフマン符号化を組み合わせたもののようですが、最大の特徴はHTMLやJavaScriptに頻出の文字列を考慮した巨大な辞書を仕様に内包することで、その高いパフォーマンスを実現している点でしょう。いかにも「実用」向きのアルゴリズムですが、昨今のWeb業界はこうした技術に支えられている部分が大きそうではあります。
コマンドラインでもbrotliコマンドが利用できます。ヘルプを見る限り、オプションの指定方法などはgzipとかなり互換性があるように設計されているようです。
bsdgames-osx
- BSD Games
- https://github.com/ctdk/bsdgames-osx
BSD系のOSで利用可能だったらしい古典的なゲーム群です。このフォーミュラによりインストールされるゲームは全部で40種類あるようで、その一覧はREADMEにあります。個人的には、暇な時に「英語の勉強」と称してhangmanでよく遊びます。ただしこのゲームのお題は、/usr/share/dict/wordsというマニアックなものを含めて20万もの英単語を収録する辞書ファイルなので非英語ネイティブの私にはあまりにも難易度が高いのが難点です6。
bsdmake
- BSD Make
- https://opensource.apple.com/
macOS標準のコマンドラインツールは多くがBSD系なのですが7、なぜかmakeはGNU Makeです(例によって、かなり古いバージョンのものではありますが)。BSD系のMakeが使いたい場合は、このフォーミュラを利用するのが手っ取り早いです。個人的には、わざわざ好んでbsdmakeを使用することは一切ないのですが、上述のbsdgames-osxをビルドする際などに必要になります。
c-ares
- C library for asynchronous DNS requests
- https://c-ares.haxx.se/
名前の通り非同期的にDNSリクエストを行うためのCライブラリのようです。cURL (curl) やその下敷きになっているlibcurlのために開発が始まったそうですが、IPv6に対応するなど高機能で、対応プラットフォームも多いので様々なネットワーク関連のプロジェクトに採用されています。
c2048
- Console version of 2048
- https://github.com/mevdschee/2048.c
2014年ごろにスマートフォン向けゲームとして一世を風靡した「2048」をコンソールで遊べるようにしたものです。フォーミュラの名前はc2048ですが、インストールされるコマンドは単に2048です。スマホ版はスワイプで操作しましたが、コンソール版は基本的に矢印キーで操作を行います。実はVimライクなキーバインドにも対応していて、矢印キーの代わりにj, k, h, lで操作することもできます。

cairo
デバイス非依存の2Dグラフィックス描画ライブラリのようです。アンチエイリアスによる滑らかな画像描画や透過色にも対応しているため出力の美しさに定評があり、GTK+ やFirefoxでも採用されています。C言語ライブラリながら様々な言語にバインディングが存在し、特にRubyバインディングrcairoについては『るびま』に日本語で読める丁寧なチュートリアルがありました:
組版技術周りでもfontforge, harfbuzz, popplerなどが採用しているようなので、TeXユーザも間接的に恩恵を受けているものと思われます。
camlp5
- PreProcessor-Pretty-Printer of OCaml
- https://camlp5.github.io/
もともとcamlp4という、通称“P4”(PreProcessor-Pretty-Printerの4つのPが由来らしい)と呼ばれるOCamlのマクロ・文法拡張システムがあって、camlp5はそのフォークプロジェクトのようです(camlp4というHomebrewフォーミュラも別に存在しています)。このあたりの事情やP4の概説については以下のブログ記事が有益でした:
私自身はいまのところ OCamlユーザではないので、camlp4もcamlp5も直接は使用していませんが、後述する定理証明支援系CoqがP5に依存しているため導入されています。
clingo
- Clingo
- https://potassco.org/
解集合プログラミング (ASP) ソルバだそうですが、具体的に何ができるのかはきちんと把握できていません。先述のaspcudのバックエンドとして用いられています。
cmake
- Cross-platform Make
- https://www.cmake.org/
CMakeは名前の通りクロスプラットフォームにビルド自動化を実現するためのツールです。バックエンドはプラットフォームごとに適切なものを選択して利用するようで、例えばmacOSではXcode、WindowsではVisual Studio、LinuxではMakeが用いられます。しかし、CMakeユーザはこうした違いを意識することなく、とにかくCMakeLists.txtと呼ばれるビルド手順記述ファイルを作成するだけで様々なプラットフォームでプログラムをビルドできるということです。その目的から明らかなように、CMakeはクロスプラットフォームなプロジェクトでの採用率が高いようです。
colordiff
- Color-highlighted diff
- https://www.colordiff.org/
その名の通りdiffを色付きにしてくれるやつです。かなり見やすくなるので私は重宝しています。
設定ファイル (~/.colordiffrc) を置くと、使用する色などを制御できます。GitHubリポジトリを覗くと、いくつか.colordiffrcのサンプルが置いてあります。
colordiffrc: デフォルト設定colordiffrc-gitdiff: 暗い背景を利用している向けのgit diffっぽい色設定colordiffrc-lightbg: 明るい背景を利用している人向けのテンプレート設定
また、colordiffの出力をパイプでlessに渡す場合は-Rオプションを付けないとうまくいかないので注意が必要です(環境変数をexport LESS='-R'と設定してしまうのも手のようです)。
$ colordiff <args> ... | less -R
coq
有名な定理証明支援系です。とりあえず使ってみたいと思って導入してはあるのですが、なかなか重い腰が上がらず試せていないので、私には詳細を語る見識も資格もありません。
対話的に証明を行うものらしくEmacsのプラグインを利用することが多いと聞きました。Vimについてもサポートプラグインがあった気がしますが、個人的な感触としてはVimと他の対話的なシステムはあまり相性がよくない気がしていて、どうなんでしょう……
coreutils
- GNU File, Shell, and Text utilities
- https://www.gnu.org/software/coreutils
上述したように、macOSに同梱されているUNIXコマンドのほとんどはBSD系です。GNU系とBSD系のどちらがいいということは一概に言えませんし、やや宗教戦争じみている部分もありますのでここではそういう議論は避けますが、世の中の(特にLinux向けの)多くの文献がGNU系のツールを前提としているのは事実なので、macOS上にもGNUコマンドを一通り揃えておくと便利です。
Homebrewフォーミュラとしては、GNU系コマンドはいくつかのサブセットに分割されています。具体的にどのようなサブセットがあるかということについては下記のブログ記事によくまとまっています。
coreutilsは中でも特にOSの基本的な操作(ファイル、シェル、テキスト関連)を扱うものをまとめたものです。
$ brew install coreutils
をするだけでそうした基本操作を扱うGNUコマンドが多数インストールされます。具体的にインストールされるコマンドの一覧は以下を参照してください。
ただし、上記の方法でインストールした場合、すべてのコマンドがgプレフィックス付きになります。例えばGNU lsコマンドを使いたい場合は
$ gls
とする必要があります。macOS向けのツール(標準添付のものを含む)の中には、こうした基本コマンドはBSD系であることを前提に呼び出しを行うものがある可能性があるので、私はこのgプレフィックスを取らないことをおすすめしますが89、どうしてもプレフィックスなしで使えるようにしたい場合はbrew info coreutilsで表示される説明にしたがってPATHを設定します。
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
cowsay
有名なPerl製ジョークツールです。引数に与えた文字列をウシが喋るアスキーアート (AA) を表示させられます10。
$ cowsay Hello!
________
< Hello! >
--------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
使いどころが謎ですが、cowthinkというバリエーションもあります。
$ cowthink Hmm...
________
( Hmm... )
--------
o ^__^
o (oo)\_______
(__)\ )\/\
||----w |
|| ||
なおデフォルトでは日本語は利用できないので、ウシに日本語を喋らせたい場合はちょっと工夫が必要です。
また、実はウシ以外のAAも多数用意されていて、-fオプションでデザインを指定することでウシ以外の動物(?)にも色々喋らせたり考えさせたりすることができます。
$ cowsay -f daemon '\expandafter'
______________
< \expandafter >
--------------
\ , ,
\ /( )`
\ \ \___ / |
/- _ `-/ '
(/\/ \ \ /\
/ / | ` \
O O ) / |
`-^--'`< '
(_.) _ ) /
`.___/` /
`-----' /
<----. __ / __ \
<----|====O)))==) \) /====
<----' `--' `.__,' \
| |
\ /
______( (_ / \______
,' ,-----' | \
`--{__________) \/
このように利用可能なAAの一覧はcowsay -lで確認できます。
さらに、こうしたAAを自分で用意することもできます。GitHubリポジトリのcowsディレクトリを覗くと例がたくさんあるので、参考にして*.cowファイルを作ります。cowファイルを作ったら-fオプションでそのパスを指定します。私もゆきだるまのcowファイル (snowman.cow) を作ってみました。
$ cowsay -f ./snowman.cow "Jan 18 is the World Day of Snowman\! Let's celebrate\!"
_____________________________________
/ Jan 18 is the World Day of Snowman! \
\ Let's celebrate! /
-------------------------------------
\
\ _[_]_
(")
>-( : )-<
(__:__)
今回はここまでです。次回があるといいですね。
-
HomebrewはmacOS専用ですが、最近ではこれをLinux向けに移植したLinuxbrewというツールもあります。Linuxの多くのディストリビューションには専用パッケージマネージャがありますが、sudo権限のないサーバでホームディレクトリ以下に色々なツールをインストールしたいような場合には私もLinuxbrewを重宝しています。 ↩︎
-
「ウェブサイト」の意味で「ホームページ」という用語を使うのは厳密には誤りで、私も普段は決して使わないのですが、Homebrewの用語で「フォーミュラの公式ウェブサイト」は「ホームページ」と呼称しているので、本稿ではそれに従いました (cf.
brew help home)。 ↩︎ -
コンテンツのハッシュ (md5, sha1) をXML形式で並べたもののようです。 ↩︎
-
manページに記載はないですが、RAWファイルの情報も表示できるようです。 ↩︎
-
--installedオプションを外すとHomebrew公式にフォーミュラの存在するすべてのboostに依存するプロジェクト(800超)を一覧にできますが、実行にはかなり時間がかかります。 ↩︎ -
調べた限り、この出題元の辞書ファイルを変更するオプション等は存在しないようです。 ↩︎
-
gccコマンドすら実は本物のGCC (GNU Compiler Collection) ではなく、GCCのフリをしたClang (LLVM) だったりします。 ↩︎ -
特定のコマンドについて、GNU系のものを優先的に使いたい場合は、ログインシェルの設定ファイル(
.bashrcや.zshrc)にalias ls="gls"等のエイリアスを作る方がまだ安全でしょう。 ↩︎ -
個人的には、BSD系コマンドとGNUコマンドは状況に応じて使い分けているので、後者を利用する場合は明示的に
gプレフィックス付きで利用しています。 ↩︎ -
完全な余談ですが、LaTeXで同様のことをするducksayというパッケージがあり、TeX Liveにも含まれています。 ↩︎