= Cd 組込みコマンド
:encoding: UTF-8
:lang: ja
//:title: Yash マニュアル - Cd 組込みコマンド

dfn:[Cd 組込みコマンド]はシェルの作業ディレクトリを変更します。

[[syntax]]
== 構文

- +cd [-L|-P [-e]] [{{ディレクトリ}}]+

[[description]]
== 説明

Cd コマンドはシェルの作業ディレクトリをオペランドで指定したディレクトリに変更します。

新しい作業ディレクトリに応じて link:params.html#sv-pwd[+PWD+ 変数]の値が再設定されるとともに、前の +PWD+ 変数の値が link:params.html#sv-oldpwd[+OLDPWD+ 変数]に設定されます。新しい +PWD+ の値は +.+ や +..+ のディレクトリ成分を含みません (link:posix.html[POSIX 準拠モード]で新しいパスが +/..+ で始まる場合を除く)。

指定した{{ディレクトリ}}が相対パスの場合 (最初が +.+ または +..+ で始まるものを除く)、{zwsp}link:exec.html#search[コマンドの検索]における link:params.html#sv-path[+PATH+ 変数]の検索と同様にして、{zwsp}link:params.html#sv-cdpath[+CDPATH+ 変数]の値にあるコロンで区切った各ディレクトリ内に指定した{{ディレクトリ}}があるかどうか調べます。ディレクトリが見つかった場合は、そのディレクトリが新しい作業ディレクトリになります。見つからなかった場合は、{{ディレクトリ}}は現在の作業ディレクトリからの相対パスとなります。

+CDPATH+ 変数の検索で新しい作業ディレクトリが見つかった場合または{{ディレクトリ}}として +-+ が指定された場合は新しい作業ディレクトリのパスを標準出力に出力します。

作業ディレクトリの変更に成功した場合、{zwsp}link:params.html#sv-yash_after_cd[+YASH_AFTER_CD+ 変数]が設定されていればその値がコマンドとして解釈・実行されます (非 link:posix.html[POSIX 準拠モード]時)。

[[options]]
== オプション

+-L+::
+--logical+::
ディレクトリパスに含まれるシンボリックリンクを解決せずに新しい作業ディレクトリを決定します。新しい +PWD+ 変数の値にはシンボリックリンクになっているパス名コンポーネントがそのまま残ります。

+-P+::
+--physical+::
ディレクトリパスに含まれるシンボリックリンクを解決します。新しい +PWD+ 変数の値はシンボリックリンクを含みません。

+-e+::
+--ensure-pwd+::
このオプションは +-P+ (+--physical+) オプションと一緒に指定する必要があります。
作業ディレクトリが変更された後に、+PWD+ 変数に設定すべき新しい作業ディレクトリパスが特定できない場合、このオプションが指定されていると、終了ステータスが 1 になります。このオプションが指定されていない場合は、終了ステータスが 0 になります。

+--default-directory={{ディレクトリ}}+::
{{ディレクトリ}}オペランドが与えられていない場合は、代わりにこのオプションで指定した{{ディレクトリ}}を新しい作業ディレクトリとします。

+-L+ (+--logical+) オプションと +-P+ (+--physical+) オプションの両方を指定した場合、後に指定したほうを優先します。どちらも指定していない場合は、+-L+ を指定したものとみなします。

[[operands]]
== オペランド

{{ディレクトリ}}::
新しい作業ディレクトリのパス名です。絶対パスまたは元の作業ディレクトリからの相対パスで指定します。
+
この値がハイフン一つ (`-') の場合、{zwsp}link:params.html#sv-oldpwd[+OLDPWD+ 変数]の値が指定されたものとみなします。このオペランドが与えられていない場合、{zwsp}link:params.html#sv-home[+HOME+ 変数]の値が指定されたものとみなします (+--default-directory+ オプションを指定した場合を除く)。

[[exitstatus]]
== 終了ステータス

* 作業ディレクトリを正しく変更できた場合、終了ステータスは 0 です。ただし、以下の場合は終了ステータスは 1 になります:
** +PWD+ または +OLDPWD+ 変数が読み取り専用のため更新できなかった場合
** +-P+ オプションと +-e+ オプションが指定されていて、+PWD+ 変数に設定すべき新しい作業ディレクトリパスが特定できなかった場合
* 内部で呼び出される +chdir+ システムコールがエラーを返した場合、終了ステータスは 2 です。
* `-L` オプションが有効で、新しいディレクトリパス名に +..+ が含まれていて、それが存在しないディレクトリを指している場合、終了ステータスは 3 です。
* link:params.html#sv-home[+HOME+] または link:params.html#sv-oldpwd[+OLDPWD+] が未定義もしくは空文字列であるために{{ディレクトリ}}が解決できなかった場合、終了ステータスは 4 です。
* コマンドライン引数が不正な場合または{{ディレクトリ}}が空文字列の場合、終了ステータスは 5 です。

終了ステータスが 2 以上の場合、作業ディレクトリは変更されません。

[[notes]]
== 補足

Cd コマンドは{zwsp}link:builtin.html#types[必須組込みコマンド]です。

POSIX には +YASH_AFTER_CD+ 変数および +--default-directory=...+ オプションに関する規定はありません。

+YASH_AFTER_CD+ 変数の実行結果は cd コマンドの終了ステータスには影響しません。

// vim: set filetype=asciidoc expandtab:
