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


71

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


UbuntuとCentOS(したがって、おそらくRed Hat)には/usr/bin/cdシェルが組み込まれていないことに注意してください。
キーストンプソン

1
/bin/cdただし、私のFedora 19には含まれています。
slm

1
Debian(現在のテストを含むいくつかのリリースを確認しました)には、のいずれ/bin/cdもありません/usr/bin/cd
デロバート14

1
これにより、これらのシステムは厳密にPOSIXではないように思われます。他のみんなと同じように。:)
小次郎14

回答:


64

これは主に、シェルの内側と外側の両方でPOSIXツールチェストを使用できるようにするために使用します(これらを必要とする場合のPOSIXの根拠を参照)。

のためにcd、それは非常に有用ではありませんcdが、ディレクトリを変更しますが、他の副作用があることに注意してください:chdir()そのディレクトリにアクセスできるかどうかを判断するのに役立つ終了ステータスを返し、できない理由を説明する有用なエラーメッセージを出力しますchdir()できないとき。

例:

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

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

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

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

それはシェルを起動し、その中に組み込まれているものを実行することです。

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


2
副作用とエラーメッセージに関する観察のために+1。Unixの巧妙なイディオムの多くは副作用の注意深い使用に由来するということは、新しいユーザーに常に十分に説明されているわけではありません。そして、manページ自体は、大きな画像を説明するのが得意ではありませんでした。
RBerteig

SOに関する同様の質問からここに来ました、あなたが「ディレクトリの自動マウント」と言うとき、あなたが意味することを詳しく説明してもらえますか?
フレドリング


1
StéphaneChazelasの考えを少しアンパックするには、実際に自動移動可能なディレクトリを変更せずに、ファイルを読み取ろうとせずにマウントする必要がある場合は、外部cdコマンドを使用できます。自動マウント可能なリモートファイルシステムの可用性を監視する場合や、タイムクリティカルな処理を行う前に役立つ場合があります。
telcoM

11

非組み込みcdコマンドが利用可能であるという事実は、基本的にPOSIXのが原因である要件のexec家族のコマンドから呼び出すことがすべての正規組み込みコマンドについてenvfindnicenohuptimeおよびxargsこれらのコマンドの一部自体が組み込みコマンドとして実装されていない事実に組み合わせます。

cdこれらのコマンドと組み合わせることはまったく無意味なので、それはあまり意味がありません。ただし、ここに多少なりともテナント可能な例があります。

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

2
多くのビルトインは、実際にはその規則から免除されています。奇妙なことに、cdはそれらの1つではありません。
ケビン

5
私が書いた@Kevinはすべての通常のビルトインの要件であり、免除されたものは特別なビルトインです:break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unset外部コマンドとしては無関係cdですが、コマンドとしていくつかの文書化されたユースケースを持つ通常のビルトインです。
jlliagre

1

パスがアクセス可能なディレクトリに対応するかどうかをチェックすることに加えて、cd実行可能プロセスと使用するCDPATH変数、およびプリントアウトであろう、それが首尾よく使用された場合に解決ディレクトリの絶対パス。

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

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

cdはのプロセスも行いますOLDPWDcd -、環境変数はすでに利用可能であるため、これは具体的にはあまり有用ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.