5
3

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.

ご注文はHOMEに帰らないcdですか?

Last updated at Posted at 2018-03-26

bash改造記事第2回です。
前回の記事:ご注文はcdしたらlsですか?

仕事で扱うリポジトリは十数GBぐらいあるんですけど、
私の所属するチームはその一角のモジュールを担当しています。

結構深いところで作業するんですけど、間違ってcdコマンドを引数なしで実行したらホームディレクトリまで戻りやがったんです。

また、えっちらおっちらと慣れていないディレクトリを戻るハメになったわけです(´・_・`)ファッキュ-

まぁ、cd -ってしてやれば、$OLDPWDっていう環境変数に記録されている「一つ前」のパスに戻れるんですけど。
一個前にしか戻れないってのがまた(´・_・`)ハァ
それはおいおい改善していく予定です。

行き先を指定してないのに勝手に移動してほしくないわけですよ。
行き先の指定が無かったら「どこいけばいいのん?」とエラーにしてほしいわけです。
ということで、そこら辺をやっていきます。

TL;DR;

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

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

bash設定

第2羽「初めて引数なし実行した日の事憶えてる?」

憶えてるよ……勝手にホームまで戻りやがって。

前回はcdコマンドを自作関数でaliasしたので、関数の引数がどうなってるか判断してみましょう。

bashには特殊な変数が用意されています。
そういや、前回$@つかったけど無視しましたね……

特殊な変数 意味
$0 シェルスクリプトのファイル名
$n 第n引数の値
$# シェル引数の数
$* 全引数リスト。"$*"のようにダブルクオートで囲むと、"$1 $2 … $n"形式
$@ 全引数リスト。"$@"のようにダブルクオートで囲むと、"$1" "$2" … "$n"形式
$$ 実行中のシェルのプロセスID
$? 最後に実行したコマンドの終了ステータス。戻り値?
$- シェルの実行オプション。shebangとかを取ってこれる
$! シェルが最後に実行したバックグラウンドプロセスのPID

この中の関数の引数を管理している$#を使ってみましょう。

.bash_aliases
function custom_cd()
{
  if [ $# -lt 1 ]; then
    echo 'No destination!!'
    return 1
  fi
  \cd $@ && clear && ls
}

alias cd='custom_cd'

引数の数が1より少なかったら「宛先が無いよ!」と怒ります。
怒るので、エラーでも返しておきましょうか。
2つ以上の場合はcdコマンド内でエラーにしてくれるはずなので何もしないです。

引数がマイナスになるなんてことないので、引数が0個という判断でもいいんじゃないですかね。

bashのif文はtestコマンド

bashのif文は[がコマンドになっていて、testコマンドと同じように動きます。
そこら辺が気になる人はこの記事見てね

でも、今回そこはどうでもいいんですよ。

重要なのは、このtestコマンドは比較演算子とか使えないことなんですよ。
コマンドオプションで動きを制御します。
こんな感じ。

条件式 他言語相当 意味
-eq == 等しい(equal)を意味する
-lt < 未満(lesser than)を意味する
-le <= 以下(lesser than or equal)を意味する
-gt > 超(greater than)を意味する
-ge >= 以上(greater than or equal)を意味する

文字列比較では-eqを使わないとか色々と落とし穴があるんですけど……
まぁ、ググったら一括で記事にしてくれてたりするんで大丈夫でしょう。

#まとめ
Mac(というかBSD?)のcdコマンドは引数0個の実行してもお家に帰らないらしいです。
Mac持ってないので知らないんですけど(´・_・`)

stmkzaさんのコメント
Macでの挙動を調べてくださいました。
どうやらMacでもホームディレクトリに帰ってしまうようです。

私はそっちの動きの方が好みだったのでスクリプトで対応してみました。

今回は、これにて終わりです。

次の記事:ご注文は親ディレクトリに戻ることですか?

5
3
2

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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?