MENGAPA ** login ** shell lebih dari ** non-login ** shell?

24

Saya memiliki pemahaman dasar tentang dotfile dalam sistem * nix. Tapi saya masih cukup bingung tentang Perbedaan antara Login Shell dan Non-Login Shell ini?

Sejumlah jawaban yang berbeda (termasuk beberapa duplikat) telah membahas butir-butir berikut:

  • Cara memanggil sebuah masuk atau non-login shell
  • Cara mendeteksi sebuah masuk atau non-login shell
  • File startup apa yang akan dikonsumsi oleh shell login atau non-login
  • Disebut dokumentasi (misalnya, man bash) untuk detail lebih lanjut

Apa jawaban yang tidak diceritakan (dan juga sesuatu yang masih saya bingung) adalah:

  • Apa kasus penggunaan dari shell login atau non-login ? (misalnya, saya hanya mengkonfigurasi zshrcuntuk zshdan itu cukup untuk sebagian besar kebutuhan dev pribadi, saya tahu itu tidak sesederhana apa yang vimrcharus vim)

  • Apa alasan untuk menggunakan login di atas non-login shell (selain mengkonsumsi file startup & siklus hidup yang berbeda)?

Xlee
sumber

Jawaban:

15

Idenya adalah bahwa pengguna harus memiliki (paling banyak) satu shell login per host. (Mungkin saya harus mengatakan, satu shell login per host per terminal - jika Anda secara bersamaan login ke host melalui beberapa terminal, Anda akan mengharapkan memiliki beberapa shell login.) Ini biasanya (selalu?) Adalah shell pertama yang Anda dapatkan setelah masuk (maka namanya). Jadi, skema ini memungkinkan Anda menentukan tindakan yang Anda inginkan terjadi hanya sekali per login dan hal-hal yang Anda inginkan terjadi setiap kali Anda memulai shell (interaktif) baru.

Biasanya, setiap shell lain yang Anda jalankan setelah masuk akan menjadi keturunan (anak dari anak kecil ...) dari shell login, dan karenanya akan mewarisi banyak pengaturan (variabel lingkungan umask, dll.) Dari shell login. Dan, sesuai dengan itu, idenya adalah bahwa file inisialisasi login ( .login,, .profiledll.) Harus mengatur pengaturan yang dapat diwarisi, dan biarkan .bashrc(atau apa pun yang Anda gunakan) menangani yang tidak ( set,, shoptvariabel shell yang tidak diekspor) , dll.)

Gagasan lain adalah bahwa file inisialisasi login (dan hanya mereka) harus melakukan "angkat berat", yaitu, tindakan intensif sumber daya. Misalnya, Anda mungkin ingin menjalankan proses tertentu di latar belakang setiap kali Anda masuk (tetapi hanya satu salinan (contoh) dari mereka). Anda mungkin ingin memiliki beberapa informasi status (misalnya, dfatau who) ditampilkan ketika Anda masuk, tetapi tidak setiap kali Anda memulai shell interaktif baru. Apalagi jika Anda memiliki interaktifprogram / dialog (yaitu, yang membutuhkan input dari Anda) yang ingin Anda jalankan setiap kali Anda login, Anda mungkin tidak ingin menjalankannya setiap kali Anda memulai shell baru. Sebagai contoh ekstrem, dua puluh tahun yang lalu Solaris login Anda ke shell tunggal, non-grafis, non-windowed. (Saya percaya bahwa itu telah berubah sejak saat itu.) Adalah tugas .loginatau .profile(atau apa pun) untuk memulai sistem windowing, dengan perintah seperti startx. (Ini berguna sebagian karena ada beberapa sistem windowing tersedia. Pengguna yang berbeda memiliki preferensi yang berbeda. Beberapa pengguna menggunakan sistem yang berbeda dalam situasi yang berbeda, dan kami memiliki dialog di kami .profileyang bertanya "Sistem windowing mana yang ingin Anda gunakan hari ini?") Jelas, Anda tidak ingin itu berjalan setiap kali Anda membuka jendela baru atau mengetiksh.

Sudah lama sejak saya menggunakan selain dari bash kasus tepi. (Sebagai contoh, saya menulis skrip dengan #!/bin/sh, jadi pada beberapa sistem, skrip saya berjalan dengan dash, dan pada yang lain dijalankan dengan bashdalam mode POSIX. Beberapa kali setahun saya menjalankan csh/ tcshselama beberapa menit untuk melihat bagaimana ia menangani sesuatu, atau untuk jawab sebuah pertanyaan.) Jika Anda menggunakan banyak cangkang (misalnya, bashdan zsh) setiap hari, pola Anda mungkin berbeda. Jika shell utama Anda (sebagaimana didefinisikan dalam /etc/passwd) adalah bash, Anda mungkin ingin memanggil zshshell login, dan kemudian mungkin memanggil beberapa zshshell non-login interaktif yang lebih rendah dari itu. Anda mungkin harus menghindari memiliki shell login yang berada di bawah shell login lain dari jenis yang sama.

Seperti disebutkan dalam Perbedaan antara Login Shell dan Non-Login Shell? , aplikasi Terminal OS X menjalankan shell login, sehingga pengguna biasa biasanya memiliki beberapa "shell login" berjalan secara bersamaan. Ini adalah model yang agak berbeda dari model yang telah saya jelaskan di atas, dan mungkin mengharuskan pengguna untuk memikirkan kembali apa yang dia lakukan di .loginatau.profileFile (atau apa pun). Saya tidak tahu apakah pengembang OS X telah mendokumentasikan alasan mereka untuk keputusan desain ini. Tapi saya bisa membayangkan situasi di mana ini akan berguna. Ada saat ketika saya biasanya membuka beberapa jendela shell ketika saya masuk, dan saya akan mengaturnya ke teks dan warna latar belakang yang berbeda (dengan menulis urutan melarikan diri ANSI ke layar) untuk membantu saya melacak yang mana. Warna terminal adalah contoh dari sesuatu yang tidak diwariskan oleh anak-anak, tetapi tetap ada di dalam jendela. Jadi ini adalah hal yang ingin Anda lakukan setiap kali Anda memulai jendela Terminal baru, tetapi tidak setiap kali Anda memulai shell interaktif baru.

G-Man Mengatakan 'Reinstate Monica'
sumber