logo
Published on

Bash cdコマンドでファイルを指定しても移動

Authors

Windows 10 WSL BashやLinux Bash言語のコマンドライン・コンソール上において、cdコマンドでディレクトリだけでなくファイルを指定しても移動できるようにするオーバーライドのスクリプトを書いてみます。

yuis ASUS /mnt/c/pg$ cd ruby/hoge.md
yuis ASUS /mnt/c/pg/ruby$ cd -
/mnt/c/pg
yuis ASUS /mnt/c/pg$

オーバーライドってやつみたいな。

cd(){
    [[ -f "${1}" ]] && builtin cd "$(dirname "${1}")" || builtin cd "${1}"
}

Everythingでファイルのあるディレクトリに移りたい時、ctrl+shift+Cでファイルのフルパスはコピーできるが、フォルダパスはコピーできない。いちいちdirnameするのもあれなのでcdを改造しようと思ったら以外と面倒だった。

because it calls recursively the cd defined by you. To fix, use the builtin keyword like:

bash - Override a builtin command with an alias - Stack Overflow

ということで、builtin cdcdにするとバグります。command cdでも出来ないと思う。

cdって以外にアラグメンツが不安定っていうか不定なので、細かく指定しようとすると詰むと思います。例えば-.../とか、realpathが効かない値もありますので、"引数がファイルである"という断固確定のものにだけ処理をしてそれ以外の全て曖昧なものは通常の動作ってしたほうが後々バグに悩まされないかと。