超高速bashオペレーション


過去に書いた記事を再編して載せてます。
あんまりbashのオペレーションについて纏まっていないので以前社内紹介として纏めてみたものです。
___

オペレーションの高速化の種を紹介したいと思う。
Linuxのbash環境を主に使うと思うので、そちらを紹介しよう。
オペレーションする際に、矢印キーを多用している人はいないだろうか？
10回、20回と↑キーを押し、結局見逃したりなかったりで諦めて初めからコマンドを打ち始めていると思う。
その間にキーを何回叩いたか意識したことがあるだろうか？
まず、↑キーは何を行っているのだろうか？
『コマンドの履歴』をインクリメンタルサーチで前方検索を行っている。
実は違うモードでは停止キーにも割り当てられており、ややこしいので、
『コマンドの履歴』を使いたいと割り切り、
↑キーを使わないオペレーションを目指してみよう。
ちなみに↑キーはCTRL+pキー、↓キーはCTRL+nキーに割り当てられており、
矢印キーの無いキーボードの場合、代用する。
##『コマンドの履歴』
```bash
$ history
```

とコマンドを打つと、そのユーザで入力したコマンドの履歴が表示される。
 
* セキュリティの関係で履歴表示していない場合があるが、ここでは履歴表示されるデフォルト状態を想定
* 履歴はHISTSIZEという環境変数で定義されており、デフォルト値は1000、履歴無しは0  
コマンドの履歴の例を下にあげてみよう。

```bash
$ history
1 su – hogehoge
2 id
3 pwd
4 ls -altr
5 rpm -qa –qf ‘%{name}-%{version}-%{release}.%{arch}.rpm\n’
6 hostname
7 cat /etc/sysconfig/network-script/ifcfg-eth0
～
582 ls -al
583 ls -alh
584 ll
585 pwd
586 cd ~
587 history
$
```
左の数字が「履歴番号」というものでこの番号指定でコマンドを呼び出すことが出来る。
呼び出し方は「!履歴番号」

```bash
$ !6
hostname
hogehoge
$
```
となる。
直前は「!!」
直前のコマンドの最後の引数を呼ぶのは「!$」
直前のコマンドの全部の引数を呼ぶのは「!*」
細かいところはググって調べてくれ。ｗ　「!-n」とかもある。
## 『華麗な履歴の呼び出し方』
実はテクニック的にはここからだ。
「そういえば、さっきviコマンドで設定ファイル編集したがも一回追加編集あるな……。」
と思うことが多々あるだろう。
前回入力したviコマンドを呼び出すのは「!vi」だ。
「!(検索したい文字列)」で文字列前方一致の検索が出来る。

```bash
$ !vi
vi /etc/sysconfig/network-script/ifcfg-eth0
```
合ってた？違ってた？ｗ
違ってたら過去に入力した事実がありながら、また打つ？
ま、正規表現使えるからそれでひっかけるのが早いけど、ここは単純にgrepで引っ掛けてしまえ！

```bash
$ history | grep httpd.conf
519 vi /etc/httpd/conf/httpd.conf
521 cat /etc/httpd/conf/httpd.conf
$
```
と、呼んでしまえ。
そして、

```bash
$ !519
vi /etc/httpd/conf/httpd.conf
```
ちょっと待って！
historyコマンドも打たなかったっけ？ｗ

```bash
$ !hi | grep httpd.conf
```
か

```bash
$ !587 | grep httpd.conf
```
でよくね？

```bash
$ !hi | grep httpd.conf
history | grep httpd.conf
519 vi /etc/httpd/conf/httpd.conf
521 cat /etc/httpd/conf/httpd.conf
$
```
おお！呼べた。

```bash
$ !519
vi /etc/httpd/conf/httpd.conf
```
で、catは、

```bash
$ !521
cat /etc/httpd/conf/httpd.conf
```
で確認っと。
よしよし、俺出来る、俺出来る。
ちょいと待って待って。
ここで三通りのオペレーションが出来るよ。
まあ、今まではコマンドを↑で呼び出して、←キーを連打してたよね？（ﾆﾔﾆﾔ）
たまたま、grepで引っ掛かったから履歴番号わかってたけど、わからない場合が多い。

```bash
$ ^vi^cat
```
または

```bash
$ !!:s/vi/cat/
```
または

```bash
$ cat !$
```
どれも

```bash:①
$ !519
vi /etc/httpd/conf/httpd.conf
$ ^vi^cat
cat /etc/httpd/conf/httpd.conf
```

```bash:②
$ !519
vi /etc/httpd/conf/httpd.conf
$ !!:s/vi/cat/
cat /etc/httpd/conf/httpd.conf
```

```bash:③
$ !519
vi /etc/httpd/conf/httpd.conf
$ cat !$
cat /etc/httpd/conf/httpd.conf
```
と目的が達成できる。
①②は文字列変換
特に①は前方一致したキーワードのみ変換する。
だから、

```bash
$ vi /hoge/hoge/geho/view.txt
$ ^vi^cat
cat /hoge/hoge/geho/view.txt
```
となり、view.txtのviは変換してくれない。
あとは説明しないね。（笑）
①が活躍する場面は、
例えば、

```bash
$ !7
cat /etc/sysconfig/network-script/ifcfg-eth0
$ ^cat^vi
vi /etc/sysconfig/network-script/ifcfg-eth0
$ ^0^1
vi /etc/sysconfig/network-script/ifcfg-eth1
$ ^1^2
vi /etc/sysconfig/network-script/ifcfg-eth2
$ ^vi^cat
cat /etc/sysconfig/network-script/ifcfg-eth2
$ ^2^1
cat /etc/sysconfig/network-script/ifcfg-eth1
$ ^1^0
cat /etc/sysconfig/network-script/ifcfg-eth0
```
とかやる場合、すさまじく早くなる。
呼び出して、即実行したくない場合もあると思う。
実行されるコマンドやシェルを呼び出す場合は、

```bash
$ !6:p
hostname
$ !!
hostname
hogehoge
```
と「:p」を付けてあげることで実行せずに呼び出す。
難しくてわからねーよ！というお方へ。
コマンドを↑で呼び出して、←キーを連打派の方へ朗報！！！
↑で呼び出したら、
CTRL+a　で行頭へ移動
CTRL+e　で行末へ移動
CTRL+u　でコマンド削除だ。
CTRL+u か CTRL+c
で

```bash
$
```
状態のときに
CTRL+d
で

```bash
$ exit
```
と同じだ。
もうここ何年も「exit」という文字は打っていない。（嘘）

```bash:ex.Webサーバなどにsshして作業しまくるとき、
$ ssh hogehoge101
password:
$
～
$
（CTRL+d）
$ ^101^102
ssh hogehoge102
password:
$
～
$
（CTRL+d）
$ ^102^103
```
と流れ作業したりする。
さて、ここまでで今回は終了だ。
 
Linuxオペレーションでどれだけ無駄にキーを叩いていたか驚いていることであろう。
これを覚えて実践しているだけで、オペレーションの正確性、速さが抜群に違ってくる。
今まで無駄にキーを叩いていた時間を正確で迅速なオペレーションに代替し、生まれるのが貴重な時間である。
その生まれた時間を確認や準備に費やすことで更に質が向上する。
そんなん知ってるよという方もいるだろうが、気が付くと↑キーを連打している方は、またここに来て、オペレーションを修正していくことをオススメする。

* ちなみにbash環境であればLinuxであろうがSolarisであろうがHP-UXであろうがAIXであろうが一緒。
* 正確性、速さなどのメリットがあるが、更にscriptコマンドやターミナルのログが綺麗という事後作業でのメリットもある。
たぶんこれを実践していれば、赤い服を着なくてもマシンを赤く塗らなくても３倍くらいオペレーションは早くなる。

注意：オペレーションの仕方は人それぞれで、csh環境の師匠はいるが、bashについては完全に俺流ですので、あしからず。
参考サイト：
http://www.geocities.co.jp/AnimeComic-Pastel/3829/words01_Gundam.html

2011/11/06 up