LoginSignup
10
10

More than 5 years have passed since last update.

cdコマンドの履歴で”戻る/進む”機能を実装する3行のAlias

Last updated at Posted at 2016-03-11

経緯

むか~し新人研修でUnixやってるときに、暇だったので書いてみたやつです。

"cd -"でも、一個前のディレクトリには戻れますが、一個だけしか戻れないのでついカッとなって書きました。
今見たら、若干理解に苦しむのですが、この記事上げてから、改めて見直したら理解出来ました(笑)。シンプルですが、でも大体動くんだよな。。。見直したら結構動いてませんでした。(恥)なので、見直しして今は大丈夫。(のはず)

良い所(2016/03/15追記)

pushd/popdという方法も有るらしいというtweet頂き、確認したところ確かに有るようですね。知らなかった。有難うございます。
ただ、pushdとか指定しないとスタックに積めないってのはめんどい。

このaliasの特徴としては、以下となるかと思います。
・ユーザーは、特にスタックを意識せずに日常的にcd XXXXとかやれば良い。
・ヒストリを戻りたい時はb、戻ってきたヒストリをやっぱり元に進み(?)たい時はfで進めます。
・幾つかヒストリを戻ってきて、そこで再度全然別のDirにcdすると、そこから新たにヒストリを積み直しますから、ブラウザの履歴の動きとほぼおんなじです。
・もちろん、cd -cdも問題なく動く。

実装

エイリアスで、以下の3つを登録します。

2016/03/15追記
当初のやつはバグがありました。ストックしてくれる人が意外にも有り難い事にいらっしゃったので、大体うごく、で公開しちゃいかんだろと反省し、十年前の拙さを多少補いました。
以下はかなりちゃんと動きます。

alias b='if [[ $l -le 1 ]]; then l=1; if [[ $f2 -eq 1 ]]; then f2=;if [ "$la" != "$PWD" ]; then h=$PWD:$h;la=$PWD;fi;fi;fi;((l=l+1));f=1;cd'
alias f='f=1;if [[ $l -le 1 ]]; then l=1;f=;else ((l=l-1));cd;fi'
alias cd='((l2=l+1));if [[ $f -eq 1 ]];then f=;t=`echo $h|cut -f$l -d:`;else f2=1;if [ "$la" != "$PWD" ]; then h=$PWD:`echo $h|cut -f$l2- -d:`;la=$PWD;fi;l=0;t=;fi;cd $t'

以下は本記事公開当初のものですが、色々イケてないので非推奨。(家康のうんこ漏らし絵的に自戒の念を込めてそのまま載せます。)

alias b='flag=1;if [[ $level -le 0 ]]; then level=0;fi;((level=level+1));cd'
alias f='flag=1;if [[ $level -le 0 ]]; then level=0;else ((level=level-1));fi;cd'

alias cd='if [[ $flag -eq 1 ]];then target_dir=`echo $thpa|cut -f$level -d:`;else thpa=$PWD:`echo $thpa|cut -f$level- -d:`;level=0;target_dir=;fi;flag=;cd $target_dir'

んで、好きなだけcdとかして、bってコマンドうつと、ブラウザの戻るボタンと同じ。
fってコマンド打つと、ブラウザの進むボタンと同じ。それだけです。

解説は、、、あんまり覚えてないので出来ません。。そのうち書きます。
大体動きます。大体。わりとちゃんと動きます。割とレアなケースで、bしても1回だけ移動せずに同じディレクトリに残る様に見えるケースがある位で、あとは大丈夫。(のはず。)

以上です。

実際のところ、、(これも2016/03/15追記)

作者はあんまり使ってません。 :stuck_out_tongue_closed_eyes:
というのも、

  • 研修後アサインされた部署では何百もあるUnixサーバーの運用とかやってたので、一々サーバー毎のAliasとか管理面倒くさかったから。「こっちにはあるけどコッチにはないじゃん。あーーーー」となる。
  • 先輩と会話したら、「そういう便利なのが何にも無い状況で障害対応せざるを得なかったらどうするんだよ。パス覚えとけ。」と一蹴され、確かに一理ある、と思いました。
  • 仕事でそういう体になってしまったので、そもそもaliasで何か登録するという行為自体をやらなくなった。
  • 今は複数のUnix(Linux)に入るし、作ったり消したりも多いので、ますます個別カスタマイズなんてやらないのが当たり前になった。

まぁ、そういうスタイルなので実質的にあんまり使えないだけです。
人によっては役に立つのかもしれないので、そういう人は使ってみてください。

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10