web-dev-qa-db-ja.com

`cd`外部コマンドのポイントは何ですか?

このすばらしい答え で参照されているように、POSIXシステムには、シェルの組み込みに加えて、外部バイナリcdがあります。 OS X 10.8では/usr/bin/cd。組み込みのcdのように使用することはできません。独自の作業ディレクトリを変更するとすぐに終了するためです。それはどんな目的に役立ちますか?

75
kojiro

これは主に、シェルの内部と外部の両方でPOSIXツールチェストを利用できるようにするためのものです(これらを要求するための POSIX根拠 を参照してください)。

cdの場合、これはそれほど有用ではありませんが、cdはディレクトリを変更しますが、その他の副作用があることに注意してください。これは、chdir()そのディレクトリにあるかどうかに関係なく、できない場合はchdir()できない理由を説明する有用なエラーメッセージを出力します。

例:

dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)

別の潜在的な副作用は、ディレクトリの自動マウントです。

いくつかのシステムでは、標準のShellビルトイン用のほとんどの外部コマンドは、次のものと同じスクリプトへのシンボリックリンクとして実装されています。

#! /bin/sh -
"${0##*/}" "$@"

それは、シェルを起動して、組み込みを実行することです。

他の一部のシステム(GNUなど)には、動作がシェルの組み込みバージョンと異なる場合に混乱を招く可能性がある真の実行可能コマンドとしてのユーティリティがあります。

66

非組み込みcdコマンドが使用できるという事実は、基本的にPOSIX requirement が原因で、execファミリーコマンドenvfindNiceNohuptimeおよびxargsを組み合わせて、すべての通常の組み込みコマンドを呼び出すことができます。これらのコマンドの一部は、組み込みとして実装されていません。

cdをこれらのコマンドと組み合わせるのは無意味なので、これはあまり意味がありません。ただし、これは多かれ少なかれテナブルな例です:

find . -type d -exec cd {} \;
env HOME=/foo cd
11
jlliagre

パスがアクセス可能なディレクトリに対応するかどうかを確認することに加えて、cd実行可能ファイルはCDPATH変数を処理して使用し、- 出力される の絶対パス正常に使用された場合は解決されたディレクトリ。

$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib

これは非常にまれにしか役に立ちませんが、一致するディレクトリを検索するための同じロジックを再実装する手間が省けます。具体的な使用例は、いくつかの可能な親の下で特定の名前の最初の既存のディレクトリを見つけることです。

cdは、OLDPWDも処理しますcd -、しかし、環境変数はすでに利用可能であるため、それは具体的にはあまり有用ではありません。

1
Michael Homer