まえおき
開発や運用などをやっていると、ファイル名やディレクトリ名に、日時やホスト名などを埋め込みたいことがよくある。
例えば、数台のサーバから messages ログを収集しなきゃいけない時、ホスト名-messages-収集日 としたり、リリース物を作るなら、プロフダクト名-snapshot-日付.tar.gz とするなど。
よくある記法は ${HOSTNAME}-messages-`date +%Y%m%d
`のような記法だと思う。
この記法は、いろいろな意味で良い記法だと思う。汎用の手順書とかであれば尚更。
とはいえ、普段使いとしてはタイプ数が多すぎる。
なんとか楽ができないかと思って調べてみた。
readlineでコマンドラインの編集
readline の設定を追加することで、入力中のコマンドライン文字列を編集できる。
まずは、bash で次のコマンドを叩いてみる。
bind -x '"\C-x;": READLINE_LINE=${READLINE_LINE:0:${READLINE_POINT}}$(date +%Y%m%d)${READLINE_LINE:${READLINE_POINT}}; ((READLINE_POINT+=8))'
bind '"\C-xh": "'${HOSTNAME}'"'
すると、Ctrl+x;
で、カーソル位置に yyyymmdd 形式の年月日、Ctrl+xh
でホスト名を挿入できる。
これらコマンドを ~/.bashrc あたりに仕込んでおけば、bash の入力中にかぎり横着ができる。
READLINE_LINE は入力中のコマンドライン文字列、READLINE_POINT はカーソル位置を示す変数で、それぞれを書き換えることでコマンドラインをプログラマブルに編集できる。
少なくとも bash で使用する限りにおいては bash のコマンドや、外部コマンドが使用できるため、応用範囲はかなり広いと思われる。
課題
使っている機能は readline の機能であるため、本来は bash 以外でも使えるはず。
そう思い、~/.inputrc に同設定を組み込んだが、同じ様には動いてくれなかった。 # 結果は無影響
bash から読み込んだ時くらい動いても良さそうなものだが、エラーすら出ない。
もう少し、readline について調べてみる。