GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Shell Interaktif Pada Shell Login Osx Secara Default?

Di Linux dan, setahu saya, semua sistem Unix, emulator terminal menjalankan shell non-login interaktif secara default. Ini berarti, untuk bash, shell yang dimulai akan:

Ketika shell interaktif yang bukan shell login dimulai, bash membaca dan mengeksekusi perintah dari /etc/bash.bashrc dan ~/.bashrc , jika file-file ini ada. Ini dapat dihambat dengan menggunakan --norc pilihan.

--rcfile opsi file akan memaksa bash untuk membaca dan menjalankan perintah dari file alih-alih /etc/bash.bashrc dan ~/.bashrc .

Dan untuk shell login:

Saat bash dipanggil sebagai shell login interaktif, atau sebagai shell non-interaktif dengan --login opsi, pertama kali membaca dan menjalankan perintah dari file /etc/profile , jika file itu ada. Setelah membaca file itu, ia mencari ~/.bash_profile , ~/.bash_login , dan ~/.profile , dalam urutan itu, dan membaca serta mengeksekusi perintah dari perintah pertama yang ada dan dapat dibaca.

--noprofile opsi dapat digunakan ketika shell mulai menghambat perilaku ini.

Pada OSX, bagaimanapun, shell default (yang bash) dimulai di terminal default (Terminal.app) sebenarnya sumber ~/.bash_profile atau ~.profile dll. Dengan kata lain, ia bertindak seperti shell login.

Pertanyaan utama :Mengapa shell interaktif default merupakan shell login di OSX? Mengapa OSX memilih untuk melakukan ini? Ini berarti bahwa semua instruksi/tutorial untuk hal-hal berbasis shell yang menyebutkan mengubah hal-hal di ~/.bashrc akan gagal di OSX atau sebaliknya untuk ~/.profile . Namun, sementara banyak tuduhan dapat dilontarkan ke Apple, mempekerjakan pengembang yang tidak kompeten atau bodoh bukanlah salah satunya. Agaknya, mereka punya alasan bagus untuk ini, jadi mengapa?

Subpertanyaan:Apakah Terminal.app benar-benar menjalankan shell login interaktif atau apakah mereka mengubah perilaku bash? Apakah ini khusus untuk Terminal.app atau independen dari emulator terminal?

Jawaban yang Diterima:

Cara yang seharusnya bekerja adalah, pada saat Anda mendapatkan prompt shell, keduanya .profile dan .bashrc telah dijalankan. Detail spesifik tentang bagaimana Anda mencapai titik itu adalah relevansi sekunder, tetapi jika salah satu file tidak dijalankan sama sekali, Anda akan memiliki shell dengan pengaturan yang tidak lengkap.

Alasan emulator terminal di Linux (dan sistem berbasis X lainnya) tidak membutuhkan untuk menjalankan .profile sendiri adalah bahwa itu biasanya sudah dijalankan ketika Anda masuk ke X. Pengaturan di .profile seharusnya dari jenis yang dapat diwarisi oleh subproses, selama itu dijalankan sekali saat Anda masuk (mis. melalui .Xsession ), subkulit lebih lanjut tidak perlu menjalankannya kembali.

Seperti yang dijelaskan oleh halaman wiki Debian yang ditautkan oleh Alan Shutko:

“Mengapa .bashrc file terpisah dari .bash_profile , kemudian? Ini dilakukan karena sebagian besar alasan historis, ketika mesin sangat lambat dibandingkan dengan stasiun kerja saat ini. Memproses perintah di .profile atau .bash_profile bisa memakan waktu cukup lama, terutama pada mesin di mana banyak pekerjaan harus dilakukan oleh perintah eksternal (pre-bash). Jadi perintah pengaturan awal yang sulit, yang membuat variabel lingkungan yang dapat diturunkan ke proses anak, diletakkan di .bash_profile . Pengaturan sementara dan alias yang tidak diwariskan dimasukkan ke dalam .bashrc sehingga dapat dibaca ulang oleh setiap subkulit.”

Semua aturan yang sama juga berlaku di OSX, kecuali satu hal — GUI OSX tidak menjalankan .profile ketika Anda masuk, ternyata karena memiliki metode sendiri untuk memuat pengaturan global. Tapi itu berarti emulator terminal di OSX bisa perlu menjalankan .profile (dengan memberi tahu shell yang diluncurkan bahwa itu adalah shell login), jika tidak, Anda akan berakhir dengan shell yang berpotensi lumpuh.

Terkait:Bagaimana cara mengubah cron Shell (sh ke bash)?

Sekarang, semacam kekhasan bash yang konyol, yang tidak dimiliki oleh kebanyakan shell lainnya, adalah ia tidak akan menjalankan .bashrc secara otomatis jika dimulai sebagai shell login. Solusi standar untuk itu adalah memasukkan sesuatu seperti perintah berikut di .bash_profile :

[[ -e ~/.profile ]] && source ~/.profile    # load generic profile settings
[[ -e ~/.bashrc  ]] && source ~/.bashrc     # load aliases etc.

Atau, mungkin saja tidak ada .bash_profile sama sekali, dan cukup sertakan beberapa kode khusus bash di .profile generik file untuk menjalankan .bashrc jika diperlukan.

Jika default OSX .bash_profile atau .profile tidak lakukan ini, maka itu bisa dibilang bug. Bagaimanapun, solusi yang tepat adalah dengan menambahkan baris tersebut ke .bash_profile .

Sunting: Sebagai catatan strugee, shell default pada OSX dulunya adalah tcsh, yang perilakunya jauh lebih waras dalam hal ini:ketika dijalankan sebagai shell login interaktif, tcsh secara otomatis membaca keduanya .profile dan .tcshrc / .cshrc , dan karenanya tidak memerlukan solusi apa pun seperti .bash_profile trik yang ditunjukkan di atas.

Berdasarkan ini, saya 99% yakin bahwa kegagalan OSX untuk menyediakan .bash_profile default yang sesuai adalah karena, ketika mereka beralih dari tcsh ke bash, orang-orang di Apple tidak memperhatikan kutil kecil ini dalam perilaku startup bash. Dengan tcsh, tidak diperlukan trik seperti itu — memulai tcsh sebagai shell login dari emulator terminal OSX Just Plain Works dan melakukan hal yang benar tanpa kluges seperti itu.


Linux
  1. UNIX / Linux :Apa itu Shell? Apa Shells yang berbeda?

  2. Cara Mengubah Shell Default Di Linux

  3. Mengapa pengguna 'bin' memerlukan shell login?

  1. Perbedaan Antara Shell Login dan Shell Non-login?

  2. Bagaimana Cara Memeriksa Apakah Shell Masuk/interaktif/batch?

  3. Mengapa Bashrc Memeriksa Apakah Shell Saat Ini Interaktif?

  1. Mengapa Nullglob Tidak Default?

  2. Mengapa Shell Login 'Sudo -i' Memecah Argumen String Perintah Di Sini-doc?

  3. Mengapa Saya Bisa Masuk Dengan Kata Sandi Sebagian??