地味ではあるが、bash が標準でもっている機能だけで、知っておくと結構便利に bash コマンドを利用できるので、メモしておく。
Table of Contents
Open Table of Contents
ディレクトリの移動
ディレクトリをスタックして活用する/pushd、popd、dirs
ディレクトリの移動には、pushd、popd、dirs コマンドに慣れると便利。
pushd は移動したディレクトリをディレクトリスタックに追加していく。
popd はその逆で、ディレクトリスタックを削除していく。
$ pwd
/Users/taka
$ pushd ~/Documents/
~/Documents ~
$ pwd
/Users/taka/Documents
$ pushd ~/Desktop/
~/Desktop ~/Documents ~
$ pwd
/Users/taka/Desktop
$ pushd ../work/radiant/tmp/
~/work/radiant/tmp ~/Desktop ~/Documents ~
$ pwd
/Users/taka/work/radiant/tmp
追加されたディレクトリは、dirs -v で確認できる。
$ dirs -v
0 ~/work/radiant/tmp
1 ~/Desktop
2 ~/Documents
3 ~
上記のディレクトリスタックの状態で、~/Documents に移動したい場合は、pushd +n を使う。n には、上記リストの左側に表示されている番号を使用する。
$ pushd +2
~/Documents ~ ~/work/radiant/tmp ~/Desktop
$ pwd
/Users/taka/Documents
ちょっとしたことだが、楽になる。
~/Desktop をディレクトリスタックから削除する場合には、
$ popd +1
~/work/radiant/tmp ~/Documents ~
$ dirs -v
0 ~/work/radiant/tmp
1 ~/Documents
2 ~
直前のディレクトリに戻る/cd -
直前のディレクトリに戻りたい時は、cd に - の引数を与えればよい。
$ cd ~/Documents/
$ cd ~/work/
$ cd -
/Users/taka/Documents
$ pwd
/Users/taka/Documents
引数の再利用
前回利用したコマンドを再度利用する場合などには、
- 直前のコマンドであれば、
!! - ヒストリからの再利用であれば、
!n。nは、historyコマンドで表示される履歴の番号
などが便利だが、この考え方は、引数にも利用できる。
あるファイルをコピーして、そのファイルを vi などで開く場合、
$ cp a.txt b.txt
$ vi b.txt
これは、以下の方法でいける。
$ cp a.txt b.txt
$ vi !:2
! を使うのはコマンドの時と同じ。その後に:(コロン)と n(数字)と入力する。数字の部分が前回のコマンドで利用した引数の位置。
上記の場合は、b.txt を指定したいので、前回コマンドの 2 番目ということで、2 を指定している。
また、最後の引数を使いたい場合には、M-. (ESC キーを押した後に、.)を入力すると、最後に使用したコマンドの最後の引数を自動で入力してくれる。
上記のコマンドであれば、vi と入力して、スペース、M-. と入力すれば、vi b.txt と入力される。
{}(ブレース)を利用したファイルパスの展開
{}(ブレース)による文字列の展開は便利に使える。
$ echo {one,two,three}sheep
onesheep twosheep threesheep
{}(ブレース)の中で、文字列を並べる際にカンマの後にスペースを入れたくなるが、入れてしまうと展開してくれないので注意。
日常生活でどう使えるか?
ある設定ファイルを編集しようとする時に、その設定ファイルのバックアップファイルを作っておくのはよくやる行為。
{}(ブレース)を使って、以下のように書ける。
$ sudo cp -p /etc/apache2/httpd.conf{,.back}
ちょっと奇妙に見えるが、結果として、/etc/apache2 ディレクトリに httpd.conf ファイルのコピーである httpd.conf.back ファイルが作成される。
{}(ブレース)の最初のところで、{ の後に,(コンマ)だけというのがミソで、上記のコマンドは、以下のように展開される。
$ sudo cp -p /etc/apache2/httpd.conf /etc/apache2/httpd.conf.back
編集後、diff を取る時にも同じ要領で便利に使える。
$ diff -u /etc/apache2/httpd.conf{,.back}
履歴(history)を活用
履歴をインクリメンタル検索/C-r
上下矢印キー、もしくは、C-p(コントロールキーを押しながら p) or C-n でコマンドの履歴を表示できるが、探したいコマンドがある程度予測のついている場合には、C-r が便利。
C-r を入力後、過去に入力していたはずで、今回使用したいコマンドの文字列を入力すると、部分一致でインクリメンタルサーチとなる。入力一文字一文字で過去の履歴の中から検索してくれる。
history から検索しているので、コマンドそのものでなくても、引数として預けた文字列でも探してくれる。
希望のものが見つかったらそのまま Enter で即実行だが、引数などをちょっと変更したいときには、C-fなり、C-bなどをタイプし、C-r から抜けると、それまで部分一致で表示されていたコマンドがそのままプロプトに表示されるので、好きに編集する。
履歴の残し方をカスタマイズ
連続して入力した同じコマンドを全て履歴として残すことにはあまり必要性を感じないなぁという場合には、連続して入力された同じコマンドは残さないようにすることができる。
$ export HISTCONTROL=ignoreboth
コマンドが発行された時間を残しておきたい場合には、以下のようにする。
$ export HISTTIMEFORMAT='%Y-%m-%d %T '
$ history
...
496 2009-12-19 21:56:37 history
497 2009-12-19 21:56:40 cp -p a.txt c.txt
498 2009-12-19 21:56:45 cp -p a.txt d.txt
499 2009-12-19 21:56:49 history
500 2009-12-19 21:58:50 exit
501 2009-12-19 21:58:57 history