web-dev-qa-db-ja.com

Shellビルトインを大文字で実行できないのに、他のコマンドでは実行できるのはなぜですか?

どうしてこれなの?

私がこれをするとき

CD ~/Desktop

デスクトップが表示されません。しかしこれは:

echo "foo
bar" | GREP bar

私に与える:

bar
33
DisplayName

他の質問から、OS Xを使用していると思います。OSXのデフォルトのHFS +ファイルシステムでは大文字と小文字が区別されません。「abc」と「ABC」という2つのファイルを同じディレクトリに置いてアクセスしようとすることはできません。どちらの名前でも同じファイルになります。 Cygwin、または大文字と小文字を区別しないファイルシステム(FAT32や ciopfs など)でも同じことが起こります。

grepは実際の実行可能ファイルであるため、ファイルシステム(PATHのディレクトリ内)で検索されます。シェルが/usr/bingrepまたはGREPの場合、grep実行可能ファイルが見つかります。

シェルのビルトインはではなくファイルシステムで検索されます:ビルトインされているため、シェル自体の内部で(大文字と小文字を区別する)文字列比較を通じてアクセスされます。

あなたが遭遇しているのは興味深いケースです。 cdは組み込みで、大文字と小文字を区別してアクセスされますが、CDは実行可能ファイルとして検出されます/usr/bin/cdcd実行可能ファイルはほとんど役に立ちません: cdは現在のシェル実行環境に影響を与えるため、常にシェルの通常の組み込みとして提供されます ですが、cd実行可能ファイル POSIXのために とにかく、それ自体のディレクトリを変更してすぐに終了し、周囲のシェルを開始した場所に残します。

type builtin でこれらを試すことができます:

$ type cd
cd is a Shell builtin
$ type CD
CD is /usr/bin/CD

typeは、そのコマンドを実行したときにシェルが実行する処理を示します。 cdを実行すると、組み込みにアクセスしますが、CDは実行可能ファイルを見つけます。他のビルトインの場合、ビルトインと実行可能ファイルは相応に互換性があります(echoを試してください)。ただし、cdは不可能です。

71
Michael Homer