ここ数回にわたっては、Microsoftからの突然の発表を受け、Linux on Windowsの話を取り上げてきた。現状、わかる範囲の情報は落ち着いてきたようなので、次にLinux on Windowsの話題を取り上げるのは正式にリリースされてからとして、今回からは連載の本来の流れに戻ろうと思う。

基本的なコマンドであるls(1)についてはひととおり説明したので、ここでいったんcdコマンドに戻り、その挙動についてもう少しくわしく解説しておきたい。

カレントディレクトリを移動するcdコマンド

本連載の第9回でも説明したとおり、cdコマンドは今ユーザーがいるディレクトリ(カレントディレクトリ)から移動するためのコマンドだ。サーバにログインしたら、大抵の場合、cdコマンドで目的のディレクトリに移動し、必要な操作を行う。基本中の基本コマンドだと言えるだろう。

cdコマンドでカレントディレクトリを移動。基本中の基本コマンドだ

カレントディレクトリは、pwdコマンドで表示させることができる。cdコマンドは引数なしで実行すると、ホームディレクトリに移動するようになっている。ホームディレクトリは、ログイン直後にユーザーがいるディレクトリで、環境変数HOMEに設定されているパスが該当する。

ホームディレクトリには、環境変数HOMEに設定されているパスが該当する

これがcdコマンドの基本の動きなわけだが、cdコマンドはls(1)コマンドとは決定的に違う点がある。cdコマンドはその実態がコマンドとして独立しているのではなく、インタラクティブシェル(Linuxディストリビューションであれば、ほとんどの場合bash)が提供している組み込みコマンドであるということだ。

cdコマンドは、組み込みコマンドである

さて、typeコマンドを使うと、cdコマンドが組み込みコマンド(組み込み関数とも呼ばれる)であることを確認できる。

typeコマンドを使うと、cdコマンドがシェルの組み込みコマンド(組み込み関数)だと確認できる

しかし、whereis(1)でcdコマンドを調べると、/usr/bin/cdという実体も存在する。

/usr/bin/cdというコマンドも用意されている

/usr/bin/cdの中身は、次のように「シェルで組み込みコマンド側のcdコマンドを実行する」といった内容になっている。

/usr/bin/cdの中身

組み込みコマンドの「cd」と、/usr/bin/cdは同じ動きをするわけではなく、むしろ/usr/bin/cd自体は意味を持っていない。/usr/bin/cdを実行しても、操作しているシェルのカレントディレクトリは移動しないのだ。

/usr/bin/cdコマンドを実行しても、操作しているシェルのカレントディレクトリは移動しない

説明がややこしいのだが、/usr/bin/cdで移動するカレントディレクトリは、/usr/bin/cdで起動するシェルのものである。そして、起動したシェル側のカレントディレクトリが変更され、そのシェルはそのまま終了する。つまり、元のシェルには何の変更も起こらないのだ。

それならば意味が無いじゃないか、ということになるが、そのとおりだ。これは仕様に準拠するために用意されているだけのコマンドで、実際にはまるで意味がない。しかし、シェルが持つ組み込みコマンドを理解するうえで、わかりやすい例だと言えるだろう。 処理によっては、コマンドとして独立していては意味がなく、シェル自体が機能を提供しなければならないものがある。そして、cdコマンドはその最たるものだ。カレントディレクトリの情報は、操作しているシェルが保持しており、cdコマンドはそのデータを書き換えるための組み込みコマンドということになる。

TIPS, アゲイン

以前cdコマンドを取り上げたときにも紹介したが、復習がてら、もう一度同じ機能を紹介しておこう。「cd -」という具合に引数に「-」を与えた場合、cdコマンドは直前のディレクトリに移動するようになっている。

「cd -」で直前のディレクトリに移動する

現在のディレクトリと直前のディレクトリは、環境変数PWDおよびOLDPWDに保存されている(これはシェルがbashやzshの場合であり、そうでないケースもある)。

現在のディレクトリと直前のディレクトリは、環境変数PWDおよびOLDPWDに保存されている

「cd -」は、「cd $OLDPWD」を実行するのと同じ意味を持つ。誤ってcdコマンドを実行してホームディレクトリに戻ってしまった場合など、「cd -」でさっきいた場所に戻れる。便利な機能だが、あまり知られていない機能でもあるので、ぜひ覚えておいていただきたい。

4 今回のおさらい

今回のおさらいは,次のとおりだ。

  • cdコマンドはシェルの組み込み機能
  • /usr/bin/cdというコマンドもあるが、このコマンドでは使っているシェルのカレントディレクトリを移動することはできない
  • 「cd -」で、直前のディレクトリに移動できる

これで、基本中の基本となるコマンドの紹介についてはひと段落ということにしようと思う。次回からは、新たなコマンドを取り上げていこう。