Help us understand the problem. What is going on with this article?

cd したら ls する

More than 5 years have passed since last update.

シェルを使用する上での定石のようなものかもしれません。ある程度コマンドラインに慣れた人なら、どのディレクトリに何があるかなどは覚えてくるものですが、cd したら ls するようになっていたら便利かと思います。

直接的に解決する

毎回 cd するたびに ls するのは面倒くさいし時間の無駄なので、関数にして cd にエイリアスします。

~/.bashrc
cdls ()
{
    \cd "$@" && ls
}
alias cd="cdls"

こうすることで、cd に成功した場合のみ ls することが出来ます。ディレクトリ名をタイプミスした場合などは ls はされません。また、どの cd か特定していないため、独自に作成している cd 関数などを妨害(上書き)することはありません。

\cd としているのは、エイリアスの cd によるループを防ぐのに明示するためです。エイリアスの回避のためのエスケープなので、cd 関数がある場合、それはエスケープされないので大丈夫です。\cd ではなく ''cd""cd でも同じです。

具体例
cd() {
    builtin cd "$@"
    echo "success"
}

cdls ()
{
    \cd "$@" && ls
}

alias cd="cdls"

独自に作成している cd 関数を妨害することなく、cd したら ls するようになっています。
実行するとわかりますが、移動に成功した場合のみ ls して、success の文字が表示されます。
ちなみに、エイリアスが一番最後に来ないと、関数の方の cd に上書きされて、ls されなくなるので注意です。

別解

~/.bashrc
cd ()
{
    builtin cd "$@" && ls
}

cd に成功した場合のみ ls することには変わりないですが、エイリアスではなく cd を関数化することで、他に作成していた場合の cd 関数による影響を受けなくなります。

また、今回は builtin としてやることで、関数の cd によるループを防いでいます。

別の手法で試みる

そもそも、

cd に成功する イコール ディレクトリが変更される

ことなんだから、コマンドを打つたびにディレクトリの変更をチェックして、コマンドを打つ前と打った後でカレントディレクトリ名が違ったら ls すれば解決ですよね。

~/.bashrc
auto_cdls()
{
    if [ "$OLDPWD" != "$PWD" ]; then
        ls
        OLDPWD="$PWD"
    fi
}
PROMPT_COMMAND="$PROMPT_COMMAND"$'\n'auto_cdls

解説です。まず auto_cdls という関数を作成し、それを PROMPT_COMMAND に追加しています。
PROMPT_COMMAND とは bash で使用されている環境変数で、コマンドを打った直後に実行されます。この性質を利用することで、毎回ディレクトリの変更をチェックすることが出来ます。

auto_cdls 関数はそのチェックをする関数です。前回いたディレクトリパスは $OLDPWD という環境変数に保存されているので、それをカレントのディレクトリパスと比較して異なっていたら ls しています。
このままでは、他のコマンドを打った時に $OLDPWD$PWD は異なったままなので ls されてしまうのを防ぐために、 $OLDPWD$PWD を代入して同じにしています。これでまた cd などでディレクトリが変更されたら自動で ls されるというわけです。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away