Mengapa kami memiliki shell bash login, non-login, interaktif, dan non-interaktif?

23

Jadi halaman bash man menjelaskan apa itu login dan shell interaktif:

Shell login adalah karakter yang argumen pertama nol adalah a -, atau yang dimulai dengan opsi --login.

Shell interaktif adalah yang dimulai tanpa argumen non-opsi dan tanpa opsi -c yang input dan kesalahan standar keduanya terhubung ke terminal (sebagaimana ditentukan oleh isatty (3)), atau yang dimulai dengan opsi -i. PS1 diatur dan $ - termasuk saya jika bash bersifat interaktif, memungkinkan skrip shell atau file startup untuk menguji keadaan ini.

Saya pikir ini berarti kita dapat memiliki 4 jenis shell:

  • Kerang login interaktif,
  • Cangkang masuk non-interaktif,
  • Kerang non-login interaktif,
  • Kerang non-interaktif non-interaktif

Tapi mengapa kita memiliki shell interaktif / non-interaktif dan login / non-login? Mengapa varietasnya? Apa yang akan kita kehilangan jika kita hanya memiliki satu jenis shell?

Juga ketika mencoba menentukan apakah saya di shell login dengan menjalankan echo $-, itu output:

himBH

Beberapa bendera ini dijelaskan di sini , tapi h, H, dan mtidak dijelaskan. Apakah ada tempat yang menggambarkan semua bendera ini?

ProgramFoo
sumber

Jawaban:

21

Ini adalah pemikiran saya tentang "jenis" kerang yang berbeda - sayangnya saya tidak menyaksikan kebangkitan Un * x sejak awal (saya berasumsi konsep ini secara historis berkembang dengan baik), jadi harap kritis.

  • Ketika saya masuk ke suatu sistem (saat ini melalui login X grafis), mungkin ada beberapa tugas yang harus dijalankan sekali, misalnya membangun koneksi ke beberapa jenis server, menyajikan kepada saya daftar todo hari ini, melakukan autostart beberapa perintah, dll. Ini seharusnya tidak bahagia setiap kali saya membuka terminal baru. Jadi ada satu set file konfigurasi ( /etc/profile, ~/.bash_logindan seterusnya, rujuk ke manual untuk daftar yang akurat) yang hanya bersumber dari shell login .
  • Oleh karena itu, untuk menutup koneksi, matikan beberapa program, jalankan skrip cadangan ~/.bash_logoutsaat shell login ada.
  • jadi, "normal" shell yang saya gunakan di terminal, seharusnya tidak menjadi shell login , tetapi tetap harus membaca preferensi pribadi saya dari ~/.bashrc, karena saya ingin ikatan kunci saya untuk berinteraksi dengan shell - maka ini adalah interaktif, non- shell login .
  • dan yang terakhir, tetapi paling tidak ketika bash digunakan untuk skrip, keduanya tidak penting. bashharus dimulai secepat mungkin, yaitu tidak boleh membaca file konfigurasi. Ini adalah shell non-interaktif, non-login .

Jadi, jawaban saya untuk pertanyaan Anda. Apa yang akan hilang jika kami hanya memiliki satu jenis shell? ada dalam satu kata: "Fleksibilitas."


Jawaban untuk pertanyaan kedua Anda mudah:

$-daftar set opsi saat ini. Ini dapat diatur oleh parameter baris perintah ke bashatau melalui setbuiltin. Jadi, Anda harus melihat dua tempat di manual:

  • OPTIONS bagian:

    -i        If the -i option is present, the shell is interactive.
  • SHELL BUILTIN COMMANDSbagian, ayat set:

    -h      Remember the location of commands as they are looked up for execution.  This is enabled by default.
    -m      Monitor  mode.  Job control is enabled.  This option is on by default for interactive shells on systems that sup
            port it (see JOB CONTROL above).  Background processes run in a separate process  group  and  a  line  containing
            their exit status is printed upon their completion.
    -B      The shell performs brace expansion (see Brace Expansion above).  This is on by default.
    -H      Enable !  style history substitution.  This option is on by default when the shell is interactive.
mpy
sumber
1
Woo Saya percaya jawaban @mpy untuk pertanyaan OP yang diformulasikan dengan jelas dapat berhasil membuat definisi yang agak berguna. Tentang itu: Jadi, shell non-login hanyalah sebagian dari shell login, benar?
tuk0z