Mengapa Shell bawaan tidak dapat dijalankan dengan huruf kapital tetapi perintah lain bisa?


33

Kenapa ini?

Ketika saya melakukan ini

CD ~/Desktop

Tidak membawa saya ke Desktop. Tapi ini:

echo "foo
bar" | GREP bar

memberi saya:

bar

4
Periksa apakah alias GREPatau which GREPhasilkan sesuatu.
chepner

1
Ini dia. Anda memiliki perintah bernama GREP, yang berbeda dari grep. (Benar, ini mungkin hanya berupa tautan keras atau tautan simbolis /usr/bin/grep, tetapi dari sudut pandang shell, ini adalah perintah terpisah.)
chepner

12
Tunggu: Anda menggunakan Mac OS X, bukan? HFS + secara default menggunakan case-preserving, yang berarti bahwa jika case penting saat Anda membuat file, tetapi begitu file itu ada, pencarian tidak peka huruf besar-kecil. Artinya, bashmungkin meminta file bernama GREP, tetapi sistem file menganggap grepkecocokan.
chepner

1
Ya, karena itu adalah Unix.
DisplayName

4
Sistem file tidak tergantung pada sistem operasi. Anda dapat menggunakan sistem file lain dengan Mac OS X, dan Anda dapat (secara teori) menggunakan HFS + dengan sistem operasi lain. Anda juga dapat membuat HFS + peka huruf besar-kecil; perilaku melestarikan kasus hanyalah default karena alasan historis.
chepner

Jawaban:


71

Dari pertanyaan Anda yang lain saya ambil Anda menggunakan OS X. Sistem file HFS + default pada OS X adalah case-insensitive: Anda tidak dapat memiliki dua file yang disebut "abc" dan "ABC" di direktori yang sama, dan mencoba mengakses salah satu nama akan sampai ke file yang sama. Hal yang sama dapat terjadi di bawah Cygwin, atau dengan sistem file case-insensitive (seperti FAT32 atau ciopfs ) di mana saja.

Karena grep ini adalah executable yang nyata, ia mencari di sistem file (di direktori PATH). Ketika shell Anda mencari /usr/binsalah satu grepatau GREPitu akan menemukan grepexecutable.

Shell builtins tidak dicari pada sistem file: karena mereka built-in, mereka diakses melalui perbandingan string (case-sensitive) di dalam shell itu sendiri.

Apa yang Anda temui adalah kasus yang menarik. Sedangkan cdbuiltin, diakses case-sensitive, CDditemukan sebagai executable /usr/bin/cd. The cddieksekusi adalah cukup berguna: karenacd mempengaruhi lingkungan eksekusi shell saat ini, selalu disediakan sebagai shell biasa built-in , tapi ada cdeksekusi untuk POSIX ini demi pula, yang mengubah direktori untuk dirinya sendiri dan kemudian segera berakhir, meninggalkan shell sekitarnya mulai dari mana

Anda dapat mencobanya dengan typebuiltin :

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

typememberi tahu Anda apa yang shell akan lakukan ketika Anda menjalankan perintah itu. Ketika Anda menjalankan cdAnda mengakses builtin, tetapi CDmenemukan executable. Untuk builtin lain, builtin dan executable akan cukup kompatibel (coba echo), tetapi untuk cditu tidak mungkin.


1
jawaban yang bagus. Aku akan mengatakan cygwin, yang akan memiliki efek yang sama.
Joshua

@ Joshua Masalah OP terpecahkan, tapi saya pikir untuk pembaca lebih lanjut dari pertanyaan, jawaban berbasis cygwin akan setidaknya sama bermanfaatnya dengan yang ada; Mungkin Anda bisa menjadikan ini jawaban yang terpisah, meskipun pendek, dan menunda jawaban yang sudah ada untuk detail?
Volker Siegel

1
Mengapa posix memerlukan perintah yang tidak berguna seperti cd, dan mengapa cd internal osx tidak memenuhi syarat?
John

2
51 upvotes! Seharusnya saya baru saja mengirim jawaban, daripada komentar :)
chepner

1
/ usr / bin / cd memiliki tujuan. sintaksnya adalah argumen / direktori program direktori usr / bin / cd
Joshua
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.