確認環境
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とは何かについてはこちらの記事を参照。)
しかし、各マニュアルを開くためには通常下記手順が必要。とても面倒だ。
- ブラウザで上記サイトを開く
- 検索ワードをフォームに入力
- 検索ボタンをクリック
- 検索結果一覧から、読みたい項目を選んで開く
こんなんじゃマニュアル開くまでに、調べたいことを忘れちゃうよ。
もっとサクッとPOSIXのマニュアルを開けないものか。。。
対策
man
コマンドのように、POSIXのマニュアルページを開くシェルスクリプトを作れないだろうか。
シェルスクリプトの動作イメージは下記。
- ユーザが指定した引数から、HTTPクエリを作成
- 作成したクエリを
wget
で送って、結果を一時ファイルに保存 - 保存した一時ファイルを
w3m
で開く w3m
を閉じたら、一時ファイルを削除
うん、これならそんなに難しくない気がする。
やってみよう。
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. wgetとw3mのインストール
もし、wget
とw3m
をインストールしていない場合は、下記コマンドでインストールしておこう。
(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
をつけているのは、リンクを絶対パスに変換するため。
実はこのオプションに頼るために、わざわざ一時ファイルとして保存している。
本当はオンメモリだけで済ませた方がいいのだろうけども、手抜きですな。
気に入らない人はチャレンジしてみてねと。
参考
以上。