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


33

どうしてこれなの?

これをするとき

CD ~/Desktop

デスクトップに移動しません。でもこれは:

echo "foo
bar" | GREP bar

私に与えます:

bar

4
何かを確認alias GREPまたはwhich GREP出力します。
chepner

1
行くぞ あなたは、指定されたコマンド持っているGREPとは区別されます、grep。(確かに、それはへのハードリンクまたはシンボリックリンクの/usr/bin/grep場合がありますが、シェルの観点からは、それは別のコマンドです。)
chepner 14年

12
待ってください。あなたはMac OS Xを使用していますよね?HFS +はデフォルトで大文字と小文字を保持します。つまり、ファイルを作成するときに大文字と小文字が区別されますが、ファイルが存在する場合、検索では大文字と小文字が区別されません。つまり、bashという名前のファイルを要求するかもしれませんGREPが、ファイルシステムgrepは一致を考慮します。
chepner

1
はい、Unixだからです。
DisplayName 14年

4
ファイルシステムはオペレーティングシステムから独立しています。Mac OS Xでは他のファイルシステムを使用でき、(理論上)他のオペレーティングシステムではHFS +を使用できます。また、HFS +で大文字と小文字を区別することもできます。歴史的な理由から、大文字と小文字を保持する動作はデフォルトです。
chepner 14年

回答:


71

他の質問から、OS Xを使用していると考えています。OSXのデフォルトのHFS +ファイルシステムは大文字と小文字を区別しません。同じディレクトリに「abc」と「ABC」という2つのファイルを配置して、どちらの名前も同じファイルになります。同じことがCygwinの下でも、大文字と小文字を区別しないファイルシステム(FAT32やciopfsなど)でも発生する可能性があります。

grep実際の実行可能ファイルであるため、ファイルシステム(のディレクトリ内PATH)で検索されます。シェルが/usr/binどちらgrepGREPを探すか、grep実行可能ファイルを見つけます。

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

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

これらをtypeビルトインで試すことができます:

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

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


1
いい答えだ。私はcygwinを言おうとしていましたが、これは同じ効果があります。
ジョシュア14年

@Joshua OPの問題は解決しましたが、質問の読者には、cygwinベースの回答が少なくとも既存の回答と同じくらい役立つと思います。たぶん、たとえ短いとしても、これを別の答えにして、詳細については既存の答えに任せることができますか?
フォルカーシーゲル14年

1
なぜposixはcdのような役に立たないコマンドを必要とし、osxの内部cdは適格ではないのですか?
ジョン14年

2
51の賛成票!コメントの代わりに答えを投稿する必要がありました:)
chepner 14年

1
/ usr / bin / cdには目的があります。構文は/ usr / bin / cdディレクトリプログラム引数です
ジョシュア14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.