Macでもmanコマンドの出力を日本語/英語切り替え出来るようにする

![スクリーンショット 2020-12-23 13.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403039/ec994c8c-a7ec-0f8e-7811-a6572feb6a05.png)
## はじめに
manコマンドとは『コマンドのレファレンスマニュアルを表示する』ためのコマンドです。([Linux基本コマンド [man]コマンド(基本編より)](https://www.atmarkit.co.jp/ait/articles/1702/16/news016.html#:~:text=%E3%80%8Cman%E3%80%8D%E3%81%AF%E3%80%81%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82))

例えば`ls`というコマンドの意味を知りたければ、

```
$ man ls
```

これでマニュアルページがターミナル上に表示されます。
(*q*キーで抜ける、vimと同じく*j*キーで下に*k*キーで上にスクロールする。また`/文字列パターン`で文字検索も出来ます。)

Linux/Unix力を伸ばすにはこうしたドキュメントを読んでコマンドを身に染み込ませる必要があると筆者も常々思っているのですが、英語で知らないことを学ぶのは中々ツライものです。

これに対して[JMプロジェクト](http://linuxjm.osdn.jp/index.html)というLinux 関連のマニュアルページの日本語ページを翻訳・公開してくれているサイトがあります。
※日本語されていないコマンドも多々あります。(T_T)

本記事では

- (1)JMプロジェクトの日本語リファレンスを`jman`という新しく作ったコマンドで読めるようにする
- (2)`man`コマンドでは同じ環境下でも英文リファレンスを変わらず読めるようにする

ということをやっていきたいと思います。

ちなみにMacOSのバージョンは下記の通り

```
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H15
```

※本記事は[Zenn](https://zenn.dev/kumamoto/articles/d536ac6df8a544)の方にも筆者本人が転載済です。加筆/修正はしばらくは両方で行います。


## groffのインストール
[groff](https://en.wikipedia.org/wiki/Groff_(software))とは雑に言えば「テキストを処理して整形するプログラム」のこと。
下記のようにMacに最初から入ってはいるが、

```
$ groff -v
GNU groff version 1.19.2
$ which groff
/usr/bin/groff
```

Homebrewで最新版にしよう。

```
$ brew install groff
$ groff -v
GNU groff version 1.22.4
$ which groff
/usr/local/bin/groff
```

## manの設定を変更
設定ファイルはMacでもLinuxと同様に/etc配下に

```
$ sudo vi /etc/man.conf

# 95-96行目あたりの下記をコメントアウトして
JNROFF		/usr/bin/groff -Tnippon -mandocj -c
# 代わりにこれを
JNROFF /usr/local/bin/groff -Dutf8 -Tutf8 -mandoc -mja -E

# 105-106行目あたりの下記２つをコメントアウトして
PAGER		/usr/bin/less -is
BROWSER		/usr/bin/less -is
# 代わりにこれを
PAGER /usr/bin/less -isr
BROWSER /usr/bin/less -isr

```

## JM Projectから日本語manページをダウンロードしてくる
※最新版はここで[チェック](http://linuxjm.osdn.jp/download.html)の上、curl[^1]コマンドでダウンロードしてみてください。

ちなみにcurlコマンドとは様々なプロトコル(HTTPやFTPなど標準はHTTP1.1)でファイルをダウンロード/転送するコマンド。今回はダウンロードに使用しています。

```
$ cd ~/Downloads
$ curl -O http://linuxjm.osdn.jp/アーカイブ名
-- 例
$ curl -O http://linuxjm.osdn.jp/man-pages-ja-20201215.tar.gz
```
※-oは標準出力に代わって、出力をファイル file へ書き込むことオプション
※-Oも標準出力に代わって、出力をファイル file へ書き込むことオプションだがリモートファイルと同じ名前でローカルのファイルが作られる

ファイルを解凍します。

```
$ tar xfz アーカイブ名
-- 例
$ tar xfz man-pages-ja-20201215.tar.gz
-- ちゃんと解凍されてますネ
$ ls | grep man
man-pages-ja-20201215
man-pages-ja-20201215.tar.gz
```

※[tar](https://www.atmarkit.co.jp/ait/articles/1608/15/news015.html)とは「アーカイブファイル”を作成／展開するコマンド」です。[^2]


続いて、解凍したディレクトリに移動して、[make](https://manual.atmark-techno.com/dist/atmark-dist_developers_guide_ja-1.0.11/ch05.html#:~:text=make%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB,%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A7%E3%81%99%E3%80%82)を実行します。[^3]

```
$ cd man-pages-ja-20201215
$ ls
INSTALL  Makefile README   manual   script
$ make config
Install directory   [/usr/share/man/ja_JP.UTF-8] ?: /
=> /usr/local/share/man/ja_JP.UTF-8(/usr/local/share/manを見ればわかるがすでにmanの説明ファイルが置かれている)
compress manual with..
      0: none
      1: gzip
      2: bzip2
      3: compress
=> 0(圧縮方法を効かれているので圧縮しないを選択)
uname of page owner [root] ?: 
=>Macのユーザー名(homebrewを使っていないならrootで良い)
group of page owner [root] ?: 
=>admin(homebrewを使っていないならwheelで良い)

All OK? (Yes, [C]ontinue / No, [R]eselect) : 
=>c(問題なければc、やり直ししたければrを回答。)

[INSTALL PACKAGE SELECTION]
->全てYしてEnterでおｋ
All OK? (Yes, [C]ontinue / No, [R]eselect) :
->c
[RESOLVE CONFLICTS]
->全て0してEnterでおk
All OK? (Yes, [C]ontinue / No, [R]eselect) :
->c
creating installation script...done
now you can "make install" as user root.

$ make install
```

## 日本語、英語のman記事を同じ環境で
`~/.bashrc`に下記を追記

```
alias man='env LANG=C man'
alias jman='env LANG=ja_JP.UTF-8 man'
```

これでmanを日本語にしたい時は`jman`コマンドを使用することが出来る。また`man`コマンドを使えば従来どおり英文リファレンスを読むことが出来る。
ただし、日本語化されていないコマンドは`jman`でも英文リファレンスが出る。
※LANG=Cの意味については[【Linux入門】ローカライゼーションのためのロケール情報設定方法](https://eng-entrance.com/linux-localization-locale)を参照すること。

ちなみにデフォルトでの表示を日本語で、英語表示は`eman`という風にするには、

```
alias eman='env LANG=C man'
alias man='env LANG=ja_JP.UTF-8 man'
```

## こぼれ話

- gitのようなhomebrewで後から入れた方を使っているコマンドの場合
/usr/**local**/share/manに入っていることに注目。ユーザーは**Macのユーザー名**、グループは**admin**となっている。

```
$ which git
/usr/local/bin/git
$ man -w git
/usr/local/share/man/man1/git.1
$ ls -l /usr/local/share/man/man1/git.1
lrwxr-xr-x  1 Macのユーザー名  admin  47 12 10 02:03 git.1 -> ../../../Cellar/git/2.29.2/share/man/man1/git.1
```

※gitは元から入っているがhomebrewで入れたものをPATHを通して使っている場合上記のようになる。treeコマンドとかでも一緒。
※vimは元から入っているがhomebrewで入れれば、日本語manページが表示されるようになる。

- lsやcdのような元から入っているコマンドの場合
いずれも/usr/**share**/下のディレクトリにあります。またユーザーは**root**、グループは**wheel**となっている。

```
$ which ls
/bin/ls
$ man -w ls
/usr/share/man/man1/ls.1
$ ls -l /usr/share/man/man1/ls.1
-rw-r--r--  1 root  wheel  17047  2 29  2020 /usr/share/man/man1/ls.1
$ which cd 
/usr/bin/cd
$ man -w cd
/usr/share/man/man1/builtin.1
$ ls -l 
-rw-r--r--  1 root  wheel  8714  2 29  2020 /usr/share/man/man1/builtin.1
```

## 参考
- [jmanを使わずにMacのmanを日本語化する方法](http://tukaikta.blog135.fc2.com/blog-entry-224.html)


[^1]: curlについては(1)[Client URL What does curl stand for?(カールとは何の省略なのか?)](https://en.wikipedia.org/wiki/CURL#:~:text=cURL%20(pronounced%20'curl'),was%20first%20released%20in%201997.)や(2)[curlコマンドの使い方15選](https://news.mynavi.jp/article/20180821-680632/)を参照してみてください。
[^2]: ディレクトリ圧縮はtar cvf、解凍はtar xvfです。
[^3]: プログラムをコンパイルするためののコマンド。どのソースコードをどのようにコンパイルすれば良いかを判断し、コンパイルに必要なコマンドを実行してくれます。makeを使うにはMakefileと呼ばれるファイルが必要となる。
Makefileはコンパイルされるソースコードの依存関係や、コンパイルに必要なコマンドなどの情報が書かれている。