Help us understand the problem. What is going on with this article?

今日のスクリプト: dhist,dcd

◆はじめに

 こんにちは.だんぷてぃ・ダイです.世の中の管理業務はスクリプトでほぼできんじゃね?と思い込んで30年,使い捨てのシェルスクリプトやsedやawkプログラムを何百と書き倒してきました.このシリーズはその中から「これ役に立つんじゃね?」と思ったものをお届けしていきます.
 ※おいらは「C-Shell(tcsh)使い」です.なので,Bashについてはあまり自信がありません.できる限り両方カバーするつもりですが…
  
 今回のは正確にはスクリプトではなくエイリアスです.ディレクトリ移動(cd)した履歴を記録しておき,履歴番号でそのディレクトリに移動,というシロモノです.

$dhist,dcdのアイデア

 change dir(cd)を繰り返していると,何回か前のディレクトリに行きたいことがありませんか.私はあります.ありまくります.

 cdしたら移動前の場所を記録しておいて,それを参照したり過去に移動したディレクトリに一発で移動できると便利だなぁ.
 
 次のようなコマンドです.

 コマンド: 使い方
 ---------------------------
 dhist : 引数なし.番号付きでヒストリーをリスト表示
 dcd [num] : 引数1個.ヒストリーの番号でそのディレクトリにcd

$準備作業あり

 上のコマンドをシェルのaliasで実装しますが,あらかじめやっておく作業があります.

  1. ~/.dhist という空ファイルを作成しておきます.

    $ touch ~/.dhist
    

    .dhistファイルはcdの履歴を入れるファイルです.これがないとシェル様に怒られます(ファイルがなければ勝手に作るプロセスを入れればいいんです.が,エイリアスの中で例外処理するが面倒で.1回作ればいいんですから(^^)).

  2. 行番号をつけてファイルの中身を表示するコマンドを用意します.今回は自作スクリプト "num" を使います.簡単なawkスクリプトです.

    #!/usr/bin/awk -f
      { printf("%4d %s\n",FNR,$0) }
    

    スクリプトの中身をaliasに入れ込んでもいいのですが,面倒で(^^)1

本体を以下に説明します.

$スクリプト本体

 私は今も昔もC-Shell(tcsh)使いです.なので,実装したのはC-Shellのエイリアスです.が,Born-Shell(bash)でもできるので後述します.

<1> csh版

C-Shell版はaliasだけで完結します.

alias cd   'echo $cwd >> $HOME/.dhist;chdir \!*;echo $cwd''
alias dhist 'num $HOME/.dhist|tail -20'
alias dcd   'cd `tail -n +\!* $HOME/.dhist|head -1`'

履歴サイズは20にしていますが好きに変更して下さい2.中身は読んでいただければわかります.が,念の為このaliasの解説は後述します.

<2> bash版

bashのエイリアスは引数を受け付けられない3ので,面倒だけどfunctionで関数を定義します.aliasはこんな感じ.

alias dhist='num $HOME/.dhist|tail -20'
alias cd='/bin/pwd >> $HOME/.dhist;\cd $@'

で,dcd関数は3行です.

# cd from dir history
 dcd(){
   \cd $(tail --lines=+$1 ~/.dhist|head -1)
 }

※ご存知ない方に:aliasは特に別ファイルを用意する必要はなく,~/.bashrcに書けばOKです.これを有効にするにはsourceします.

$ source ~/.bashrc

※使い方はどちらのシェルも同じです.

% cd hogedir
 → cdは特に意識せずに使って下さい.
  ※cshのpushd/popdを使うと記録されません.
% dhist
052 /hoge/dir/work
053 /home/mydir
054 /home/mydir/down
......ズラズラ
071 /home/mydir
 → 過去にcdしたディレクトリを番号付きで20行表示.
% dcd 52
/home/dir/work
 → 履歴5番目のディレクトリに移動.

私にとってはめちゃ便利です.

$やっていること

大したことやってません.
1. cdの都度,今の場所を~/.dhistファイルに追加書出しておく
2. dhistではnumスクリプトに通して番号表示し,tailで20行抜き出し,.
3. dcdでは,tailで.dhistの中から指定された番号の行を指定し,
4. headでその1行だけを表示し,
5. それをcdの引数に放り込む
これだけです.

お楽しみいただければ幸いです.

  だんぷてぃ・ダイ
  2020-02-18 LastEdit

  1. これこそUnixの思想,small tools(小さな単機能ツールを沢山用意して,それをつなげて大きな仕事をさせる)ですよ.その結果山のような使い捨てスクリプトが生まれてしまうわけですが(^^). 

  2. 改良して引数にするのもアリですね. 

  3. これにはびっくりです.cshのエイリアスで何気なく使っていた,記述途中の引数指定が不可能とは.その代わりに「関数」をエイリアスの中に作ることで拡張性をもたせているわけです.cshが使われなくなってしまったのは関数の実装がないからだと言っても過言ではなでしょう.設計思想の違いですなぁ. 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした