13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ご注文はcdしたらlsですか?

Last updated at Posted at 2018-03-25

fishでも似たようなの書いたんですけど、仕事場がbashなのでどんどん改造されてfish以上のコマンドになってしまいました。
それをちょっとずつでも書こうかなって。

bashで一番使うコマンドはcdコマンドだと思います。
デフォルトのcdコマンドは結構かゆい所に手が届いてくれなくて不便です。
※移動する機能単であることに意味があるので変わってほしいわけではないです。

こういうとき、Linuxユーザーは自分で改造しちゃうので私もスクリプトを書いてcdコマンドを便利にしてみました。

(うーん、enhancd使えばよくね?w使ったことないけど(´・_・`))

環境は、ubuntu16.04です。
Macさんというか、BSD環境では若干コマンドのオプションに違いがあったりするので動かないと思います。
そこら辺はMacにgnuコマンド入れるとかで乗り切ってください。

TL;DR;

僕のbash設定は、もう改造に改造を重ねてこんな簡単なbashではなくなりました。
気になる人は読んで見てください。

気が向いたら解説記事でも書きます。

bash設定

第1羽「ひと目で尋常でない不便さだと見抜いたよ」

初めてcdコマンドを触ったときに思ったのは

Windowsならフォルダをダブルクリックしたら移動して中身まで見えるのに、Linuxとかいう奴はそれすらもできんのか。使えない奴め

でした。

そこで、ディレクトリを移動したら移動先の中身が見えるようにしてみます。
こんな感じの動きですね。
cd_command.gif

.bash_aliases
function custom_cd()
{
  \cd $@ && clear && ls
}
alias cd='custom_cd'

cdして成功したら画面をclearしてlsするだけです。
cdに失敗したら何もしてほしくないので、cdを先頭にしています。

ただ&&演算で繋いだだけなので特に難しくはないと思いますが、関数内のcdにバックスラッシュを付けることがポイントです。

これ、最終的にはcdコマンドをaliasしてるわけですけど、custom_cd関数の中で普通にcd && clear & lsしちゃうとコマンド実行してからターミナルのコントロールが返ってこなくなります。

  1. cdコマンドを打つ
  2. cdコマンドの代わりにcustom_cd()が呼び出される
  3. custom_cd()内でcdコマンドが実行される
  4. cdコマンドの代わりにcustom_cd()が呼び出される
  5. 以下、無限再帰

みたいになってるんじゃないですかね。
知らんけど(´・_・`)

とにかく、コントロールが返ってこないと困ってしまうわけです。
そこでちゃんと元々のcdコマンドを呼び出すために「ビルトインコマンド」を指定してあげる必要があります。

あ、lsコマンドはaliasした奴を使ってほしいので、ビルトインコマンドにはしていません。

まとめ

既存のコマンドをそのままの名前でaliasするときは、ビルトインコマンドを使ってあげるといいでしょー

では、また次回。
多分、こういうタイトルは続かないと思います。

あと、間違ってたら教えてください。

続編書きました
ご注文はHOMEに帰らないcdですか?

13
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
13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?