Mengapa tidak ada shebang di .bashrc / .bash_profile?

22

Pertanyaan sederhana: Saya baru menyadari bahwa saya belum pernah melihat shebang di atas .bashrcskrip, yang membuat saya berpikir sistem menggunakan shell default untuk sumbernya saat login ( ${SHELL}). Saya merenungkan alasan mengapa demikian, yaitu apakah dianggap kebiasaan buruk untuk menggunakan sesuatu selain shell default untuk menjalankan skrip login.

amfibi
sumber
1
Ada alasan mengapa ini disebut bash rc ...
Ajedi32

Jawaban:

28

.bashrcdan .bash_profileyang TIDAK skrip. Mereka adalah file konfigurasi yang bersumber setiap kali bashdieksekusi dalam salah satu dari 2 cara:

  • interaktif
  • masuk

Bagian INVOCASI dari halaman bash man adalah yang relevan.

Sebuah shell login adalah salah satu yang pertama karakter argumen nol adalah -, atau satu mulai dengan --loginpilihan.

Sebuah interaktif shell yang satu dimulai tanpa argumen non-pilihan dan tanpa -cpilihan yang standar input dan kesalahan keduanya terhubung ke terminal (sebagaimana ditentukan oleh isatty(3)), atau satu mulai dengan -i pilihan. PS1 diatur dan $-termasuk ijika bashinteraktif, memungkinkan script shell atau file startup untuk menguji keadaan ini.

Paragraf berikut menjelaskan cara bashmenjalankan file startupnya. Jika ada file yang ada tetapi tidak dapat dibaca, bash melaporkan kesalahan. Tilde diperluas dalam nama file seperti yang dijelaskan di bawah di bawah Ekspansi Tilde di bagian EKSPANSI .

Ketika bash dipanggil sebagai shell login interaktif , atau sebagai shell non-interaktif dengan --loginopsi, bash pertama kali membaca dan mengeksekusi perintah dari file /etc/profile, jika file itu ada. Setelah membaca file itu, tampaknya untuk ~/.bash_profile, ~/.bash_logindan ~/.profile, agar, dan membaca dan mengeksekusi perintah dari yang pertama yang ada dan dapat dibaca. The --noprofilepilihan mungkin digunakan ketika shell dimulai untuk menghambat perilaku ini.

Ketika shell login keluar, bash membaca dan mengeksekusi perintah dari file ~/.bash_logout, jika ada.

Ketika shell interaktif yang bukan shell login dimulai, bash membaca dan mengeksekusi perintah dari ~/.bashrc, jika file itu ada. Ini dapat dihambat dengan menggunakan --norcopsi. The --rcfile file pilihan akan memaksa bash untuk membaca dan menjalankan perintah dari file bukan ~/.bashrc.

Anda dapat mengontrol kapan mereka dimuat melalui saklar baris perintah, --norcdan --noprofile. Anda juga dapat mengganti lokasi tempat mereka dimuat menggunakan --rcfilesakelar.

Seperti yang disebutkan oleh orang lain, Anda dapat meniru bagaimana file-file ini dimuat melalui penggunaan source <file>perintah atau penggunaan . <file>perintah.

Yang terbaik untuk memikirkan fungsi ini sebagai berikut:

  1. bash memulai dengan lingkungan kosong
  2. bash kemudian membuka salah satu file ini (tergantung bagaimana itu dipanggil sebagai interaktif atau masuk, dan kemudian ...
  3. ... baris demi baris mengeksekusi setiap perintah di dalam file ...
  4. ketika selesai memberi kontrol dalam bentuk prompt, menunggu input

Metode untuk memohon

Topik ini sepertinya muncul sesekali, jadi inilah sedikit contekan dari berbagai cara untuk memohon bashdan apa hasilnya. CATATAN: Untuk membantu saya menambahkan pesan "bersumber $ HOME / .bashrc" dan "bersumber $ HOME / .bash_profile "ke file masing - masing.

panggilan dasar

  1. bash -i

    $ bash -i
    sourced /home/saml/.bashrc
  2. bash -l

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  3. bash -il -atau- bash -li

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  4. bash -c "..cmd .."

    $ bash -c 'echo hi'
    hi

    CATATAN: Perhatikan bahwa -csakelar tidak sumber salah satu file!

menonaktifkan file konfigurasi agar tidak dibaca

  1. bash --norc

    $ bash --norc
    bash-4.1$ 
  2. bash --noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
  4. bash --norc -l

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  5. bash --noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
  6. bash --noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
  7. bash --norc -i -atau- bash --norc -l

    $ bash --norc -c 'echo hi'
    hi

Cara yang lebih esoteris untuk memanggil bash

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 

Ini gagal

  1. bash -i -rcfile ~ / .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found

Mungkin ada lebih banyak tetapi Anda mendapatkan intinya, semoga ....

Apa lagi?

Terakhir jika Anda begitu terpesona dengan topik ini sehingga Anda ingin membaca / mengeksplorasi lebih banyak tentangnya, saya sangat menyarankan untuk melihat pada Panduan Pemula Bash, khususnya bagian: 1.2. Keuntungan dari Bourne Again SHell . Berbagai subbagian di bawahnya, "1.2.2.1. Doa" melalui "1.2.2.3.3. Perilaku shell interaktif" menjelaskan perbedaan level rendah antara berbagai cara yang dapat Anda lakukan bash.

slm
sumber
@amphibient - maaf itu sedikit di luar kendali, semoga orang akan menghargai nilainya dan tidak menghukumnya dengan downvotes. Dengan ini di sini kita sekarang dapat referensi di jawaban lain di jalan. 8-). Saya sedang merenungkan membuat tabel untuk menunjukkan ini tetapi itu akan menjadi gila 8-).
slm
Sudah benar-benar menguji ini? Saya pernah mencoba untuk mengikuti apa yang dilakukan bash saya dalam keadaan terjepit dan tidak cukup berperilaku seperti yang disarankan oleh manual
Bananguin
@ Bananguin - setiap perintah itu dijalankan oleh saya dan itu adalah output yang dihasilkan di bawah perintah. Satu - satunya "hal" potensial dengan pengaturan saya mungkin bahwa saya .bash_profilemenyertakan baris ke sumber .bashrc. Tapi saya percaya itu sangat tipikal pengaturan.
slm
Ini bisa subjektif tapi saya tidak akan mengatakan itu .bashrcdan .bash_profilebukan skrip . IMHO mereka adalah skrip tujuan khusus yang bersumber secara implisit selama inisialisasi bash atau secara eksplisit ketika Anda perlu menerapkan modifikasi mereka. Mereka tidak hanya mengkonfigurasi lingkungan bash (variabel, fungsi, alias ...) seperti yang diharapkan dari file konfigurasi. Mereka dapat melakukan tindakan apa pun seperti dalam skrip umum. Misalnya mereka dapat memulai berbagai tindakan seperti tugas latar belakang, menulis catatan log, menginisialisasi beberapa program dll. Bagaimanapun juga, terima kasih atas ringkasan terperinci!
pabouk
Jawaban ini bahkan lebih baik daripada jawaban apa pun di sini stackoverflow.com/questions/415403/… !
Jacob Tomlinson
13

.bashrcskrip hanya dijalankan dengan bashsendirinya. Mereka tidak berdiri bebas, dan mereka tidak dimaksudkan untuk execdiucapkan oleh sistem. (Pada kenyataannya, mereka umumnya tidak ditandai dapat dieksekusi, dan, seperti yang Anda katakan, mereka tidak memiliki garis shebang.)

Script tersebut dimaksudkan untuk menjadi sourced, karena mereka umumnya melakukan hal-hal seperti mengubah variabel lingkungan ( $PATH, misalnya), yang diharapkan bertahan setelah script selesai. Jadi benar-benar tidak ada gunanya mencoba mengeksekusi satu dalam subkulit.

Rici
sumber
5

Selain balasan lain, perhatikan bahwa jika Anda menginginkannya, tidak ada yang melarang Anda untuk meletakkan shebang di awal file konfigurasi ini.

Itu tidak ada salahnya shell mencari mereka karena shebang akan diproses seperti komentar biasa, yaitu diabaikan.

Itu mungkin membantu editor yang menggunakan penyorotan sintaks untuk mengetahui bahasa pemrograman apa yang digunakan dalam file.

Perhatikan bahwa beberapa editor suka vimmemberikan cara alternatif seperti modeline untuk yang terakhir. yaitu Anda selalu dapat menempatkan garis mode di akhir ~/.bashrcdan ~/.bash_profileseperti:

...
<code in ~/.bashrc>
...
# vim: ft=sh :
Jlliagre
sumber
1
Jawaban yang diterima dari @slm di atas sangat bagus, tetapi ini adalah apa yang saya cari, sehubungan dengan menambahkan shebang ke awal saya .bash_profileatas rekomendasi dari ShellCheck.
jlucktay
1

Saya membaca ini di mana saja tidak tahu persis di mana tetapi itu benar

Manual Bash agak membingungkan di area ini, tetapi Bash tidak eXecute ~ / .bash_profile seperti skrip shell. Itu membaca file dan kemudian mengeksekusi perintah di dalamnya (Anda dapat melakukan sesuatu yang serupa dengan menjalankan sumber ~ / .bash_profile).

Rahul Patil
sumber