bashにはpushdとその反対のpopdコマンドが内蔵されている。
pushdは指定されたディレクトリに移動後、移動先のディレクトリをDIRSTACK配列環境変数の先頭の要素として追加する。
popdはDIRSTACKの先頭の要素に保存されているディレクトリに移動後、その要素を削除して2番目の要素以降を先頭に1つずつ詰める。
pushdとpopdは移動先のディレクトリから移動前のディレクトリに戻りたいときに使用すると便利だが、ディレクトリの移動には日常的に使用するcdコマンドを使ってしまうため、popdで戻ろうとしても後の祭りとなることが多い。
そこで、cdコマンドに履歴機能を持たせることで、pushdやpopdよりも使い勝手の良いものを作成する。
~/.bashrcに以下のサブルーチンを追加する。
# 環境設定
# LAST_DIRLIST:最終DIRLIST要素番号(処理の都合上、最大DIRLIST要素数ではない)
# SAVE_DIRLIST:DIRLISTの保存先ファイル名
LAST_DIRLIST=19
SAVE_DIRLIST=$HOME/.dirlist
# ディレクトリの移動
# 使用法:chdir [dir]
# dir:移動先のディレクトリ
# 指定されていない場合はホームディレクトリに移動
# 説明:カレントディレクトリをDIRLIST配列環境変数の先
# 頭の要素として追加し、指定されたディレクトリに
# カレントディレクトリを移動する。
# DIRLISTには最大で(LAST_DIRLIST + 1)件の履歴を保存する。
function chdir
{
if [ ${#DIRLIST[@]} -gt $LAST_DIRLIST ]; then
unset DIRLIST[$LAST_DIRLIST]
fi
DIRLIST=(`pwd` ${DIRLIST[@]})
cd $*
}
# 過去のディレクトリに移動
# 使用法:unchdir [num]
# num:過去の履歴の番号(1=1つ前、2=2つ前、…)
# 指定されていない場合は1つ前に移動
# 説明:指定された履歴番号(DIRLISTの添え字)の要素を
# DIRLISTから削除し、カレントディレクトリを先頭
# の要素として追加して、削除した要素に保存され
# ていたディレクトリにカレントディレクトリを移
# 動する。
function unchdir
{
if [ ${#DIRLIST[@]} -eq 0 ]; then
echo "No changing directory"
return 1
fi
if [ $# -eq 0 ]; then
i=0
else
i=$1
if [ $i -le 0 ]; then
i=1
elif [ $i -gt ${#DIRLIST[@]} ]; then
i=${#DIRLIST[@]}
fi
i=`expr $i - 1`
fi
d=${DIRLIST[$i]}
unset DIRLIST[$i]
DIRLIST=(`pwd` ${DIRLIST[@]})
cd $d
}
# 過去のディレクトリに戻る
# 使用法:backdir [num]
# num:過去の履歴の番号(1=1つ前、2=2つ前、…)
# 指定されていない場合は1つ前に戻る
# 説明:先頭から指定された履歴番号(DIRLISTの添え字)
# までの要素をDIRLISTから削除し、指定された要素
# に保存されていたディレクトリにカレントディレ
# クトリを移動する。
function backdir
{
if [ ${#DIRLIST[@]} -eq 0 ]; then
echo "No changing directory"
return 1
fi
if [ $# -eq 0 ]; then
i=0
else
i=$1
if [ $i -le 0 ]; then
i=1
elif [ $i -gt ${#DIRLIST[@]} ]; then
i=${#DIRLIST[@]}
fi
i=`expr $i - 1`
fi
d=${DIRLIST[$i]}
DIRLIST=(`awk "BEGIN {for (i = $i + 2; i < ARGC; i++) {print ARGV[i], "\n";}}" ${DIRLIST[@]}`)
cd $d
}
# ディレクトリの移動履歴を表示
# 使用法:printdir
# 説明:DIRLISTの全要素を履歴番号(DIRLISTの添え字)
# 付きで表示する。
function printdir
{
echo ${DIRLIST[@]} | awk '{for (i = 1; i <= NF; i++) { printf "[%d] %s\n", i, $(i); }}'
}
~/.bashrcに以下のエイリアスを追加する。
ただし、上記「スクリプトの作成」に記載したサブルーチンの後に追加しないと、例えば、chdirが実行するcdがchdirに置き換えられるため、無限にchdirを呼び出すことになり、その結果、スタックオーバーフローが発生する。
# 現在のcdコマンドの拡張など alias cd="chdir" alias ud="unchdir" alias bd="backdir" alias pd="printdir"
更新履歴
2009-06-07
2009-03-29
2008-04-22
2008-03-30
2008-03-23
2008-03-09
2008-03-08
はてな