この記事は、上智大学エレクトロニクス研究部Advent Calendar第5日目の記事です。
まえがき
コマンドのインストール時にエラーが発生する場合、 readline
が絡んでいることが多いです。これは readline
にバグがあるわけではなく、それだけ多くのコマンドに readline
が使われているということの証です。しかし、この readline
とは一体何者なのでしょうか。この記事ではそれを明らかにします。
readline
の役割
readline
はラインエディタというものの一種で、ライブラリとして配布されています。その名の通り、ライン(行)をエディタ(編集するもの)という意味で、一般的にシェルがコマンドを受け付けるところで使われています。コマンドは基本的に1行しかないためこのような名前になっているわけです。
readline
の必要性
単に文字を入力するだけであればエディタまでリッチなものは必要ありません。しかし、高度なカーソル移動、履歴機能、さらにインクリメンタルサーチといった機能を提供するためには、たくさんコードを書く必要があります。具体例としてrubyによるreadlineの実装だと8,926行にも及びます。
そこで、共通化できる部分ライブラリ化してしまいみんなで共有しようということになったわけです。ライブラリ化は開発の手間が減るだけでなく、ユーザー側にもメリットがあります。使うコマンドによって動作が異なったら扱いにくくなってしまいますよね。共通化することで操作方法を統一できるため、ユーザーも操作を覚えやすくなります。
readline
の落とし穴
そんな素晴らしい readline
ですが、ライセンスの問題で(主に)MacOSユーザーを悩ませています。
readline
は GPLv3
というオープンソースライセンスで公開されています。細かい説明は省きますが、このライセンスにはコピーレフトという特徴があり、 readline
を利用してアプリケーションを開発する場合は、その開発したアプリケーションのソースコードを公開してねという約束になっています。
これが厄介で MacOS
を開発しているAppleは自分たちが開発したコードを秘密にしておきたいので readline
を利用してアプリケーションを開発することができません。そこで、コピーレフトではないラインエディタ libedit
を利用することになりました。
このラインエディタは基本的に readline
と互換性があると言われていますが、履歴ファイルの形式や、キーボード操作のデフォルト設定が異なっています。そのため行編集ツールが libedit
であると見抜ける人でないと(MacOSでCUIを使いこなすのは)難しいというのが現状です。
readline
をカスタマイズする
~/.inputrc
を編集することでキーバインドの設定を変えることができます。細かい設定を解説すると分量が膨れ上がってしまうので、ここではいくつかの記事を紹介する程度に留めておきます。