bash コマンドをもっと便利に使う

Written by @dr_taka_n at 2009/12/19 22:28 [, ]

地味ではあるが、bash が標準でもっている機能だけで、知っておくと結構便利に bash コマンドを利用できるので、メモしておく。

ディレクトリの移動

ディレクトリをスタックして活用する/pushdpopddirs

ディレクトリの移動には、pushdpopddirs コマンドに慣れると便利。

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

引数の再利用

前回利用したコマンドを再度利用する場合などには、

  • 直前のコマンドであれば、!!
  • ヒストリからの再利用であれば、!nn は、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
blog comments powered by Disqus