【FreeBSD】POSIXのマニュアルをサクッと開きたい

確認環境

PC Thinkpad X1 Carbon 2nd Gen
OS FreeBSD 12.0-RELEASE-p6
w3m w3m version w3m/0.5.3+git20190105
wget GNU Wget 1.20.3 built on freebsd12.0.

課題

POXIX(というよりSUS?)のマニュアルはこちらのサイトで公開されている。
(POSIXとは何かについてはこちらの記事を参照。)

しかし、各マニュアルを開くためには通常下記手順が必要。とても面倒だ。

  1. ブラウザで上記サイトを開く
  2. 検索ワードをフォームに入力
  3. 検索ボタンをクリック
  4. 検索結果一覧から、読みたい項目を選んで開く

こんなんじゃマニュアル開くまでに、調べたいことを忘れちゃうよ。

もっとサクッとPOSIXのマニュアルを開けないものか。。。

対策

manコマンドのように、POSIXのマニュアルページを開くシェルスクリプトを作れないだろうか。

シェルスクリプトの動作イメージは下記。

  1. ユーザが指定した引数から、HTTPクエリを作成
  2. 作成したクエリをwgetで送って、結果を一時ファイルに保存
  3. 保存した一時ファイルをw3mで開く
  4. w3mを閉じたら、一時ファイルを削除

うん、これならそんなに難しくない気がする。

やってみよう。

  1. シェルスクリプトの使用例
  2. wgetw3mのインストール
  3. コード
    • 補足) POSTリクエストについて

1. シェルスクリプトの使用例

以降、今回作成するシェルスクリプト名をpmanとする前提で説明。

引数なしで検索トップページを開く

単語を入力して検索フォームのトップページを開く。

> pman  

引数のページを開く

POSIX(というよりSUS?)の仕様は下記分類になっており、マニュアルを開くには、どの分類のどのページなのか指定する必要がある。

分類 内容
Base Definitions (XDB) 仕様記述定義、提供されるべきC言語ヘッダファイル
Shell and Utilities (XCU) コマンド(grepなど)とシェル(sh)
System Interfaces (XSH) 提供されるべきシステムコールC言語ライブラリ
Rationale (XRAT) リファレンス的なもの

今回のシェルスクリプトでは、分類はオプション(-b,-f,-u)で指定し、その後にページ名を指定する。

> pamn -b stdio.h   # XBD分類の stdio.h のページを開く  
> pamn -f printf    # XSH分類の printf のページを開く  
> pamn -u grep      # XCU分類の grep のページを開く  

これは、調べたい対象の分類とページ名が分かっている場合のみ使える。
わからない場合は、後述の-sオプションを使って検索する。
一番頻度が高いと思われるgrepなどのコマンドなら、オプション-uは省略して良い。

> pman grep         # '-u'と同じでXCU分類の grep のページを開く  

なお、XRATのページはあまり無さそうだったので用意していない。
(XRATのページを読みたい場合は、検索トップページに'Rationale'というリンクがあるよ)

引数の単語検索

分類やページ名が分からないときは、-sオプションで単語検索できる。
引数の単語での検索結果一覧ページを開く。

> pamn -s terminal  

2. wgetw3mのインストール

もし、wgetw3mをインストールしていない場合は、下記コマンドでインストールしておこう。
(root権限で実行してね)

> pkg install wget ja-w3m  

コード

今回用意したシェルスクリプトはこちら。

ざっくりポイント解説。

  • 3行目: マニュアルページをwgetでダウンロードする際の一時ファイル名
  • 24行目: POSIXマニュアルのバージョンURL。新しいバージョンが出たらここを変えればいいはず
  • 27〜42行目: オプション、引数の処理
  • 46〜47行目: -sオプション指定の場合。POSTリクエストで検索した結果ページをw3mで開く。
  • 49〜54行目: マニュアルページを直接開く場合。ページが見つからない場合は、エラーメッセージ出力
  • 58行目: 一時ファイルを削除

スクリプトは、パスが通ったディレクトリ(*1)に保存して、実行権限を追加(chmod +x)するのをお忘れなく。
*1 ... 参考) パスを通す

補足) POSTリクエストについて

wget--post-dataオプションをつけることで、HTTPのPOSTリクエストを送ることができる。

上記コードでは、valueという名前のパラメータに、変数$PAGE_NAMEの値を渡していることになる。

パラメータ名やリクエストを送るURLはサイトのHTMLのソースで確認。

最後に

これで、マニュアルを開くまでの手順を簡略化できた。

少し幸せになった。

ちなみにwget-kをつけているのは、リンクを絶対パスに変換するため。
実はこのオプションに頼るために、わざわざ一時ファイルとして保存している。
本当はオンメモリだけで済ませた方がいいのだろうけども、手抜きですな。

気に入らない人はチャレンジしてみてねと。

参考

以上。