Konfigurasikan gnome-terminal untuk memulai bash sebagai shell login, tidak membaca .bashrc

24

Saya mencoba mengintegrasikan RVM dengan terminal gnome .

Per default, gnome-terminal tidak memulai bash sebagai shell login. Saya mengaktifkan run command as a login shellseperti yang disarankan dalam jawaban ini tentang topik yang sama mengatur RVM, tetapi ketika saya melakukan ini .bashrcfile tidak dibaca.

Sebagai contoh, saya membuat variabel lingkungan di .bashrcdan kemudian ketika saya memulai terminal gnome baru saya tidak bisa membacanya. Saya perlu menjalankan secara eksplisit source .bashrcuntuk membaca file.

Apakah ini perilaku yang diharapkan?

Arturo Herrero
sumber

Jawaban:

38

Ya, itulah perilaku yang diharapkan.

Singkatnya, perilaku tersebut adalah sebagai berikut:

  • bash dimulai sebagai shell login interaktif: terbaca ~/.profile
  • bash dimulai sebagai shell non-login interaktif: baca ~/.bashrc

Baca manual bash tentang file startup untuk detail lebih lanjut.

Secara pribadi, saya pikir perilaku ini aneh dan saya belum menemukan rasionalisasi untuk keputusan desain ini.


Beberapa penjelasan tentang terminologi:

  • Sebuah shell interaktif adalah shell dengan mana Anda dapat berinteraksi, yang berarti Anda dapat mengetik perintah di dalamnya. Kebanyakan cangkang yang akan Anda gunakan adalah cangkang interaktif.
  • Sebuah shell non-interaktif adalah shell dengan yang Anda tidak bisa berinteraksi. Script shell dijalankan di dalam shell non-interaktif.
  • Sebuah shell login adalah shell yang dimulai ketika Anda login ke sistem anda.
  • Sebuah non-login shell adalah shell yang dimulai setelah proses login.

Sebagian besar shell yang Anda lihat adalah shell non-login interaktif . Ini terutama benar jika Anda menjalankan lingkungan grafis seperti gnome, karena gnome adalah "shell login". Setiap sesi bash yang dimulai di dalam gnome adalah shell non-login. Jika Anda ingin melihat shell login interaktif nyata kemudian pergi ke konsol virtual (menggunakan Ctrl+Alt+F1) dan kemudian login menggunakan nama pengguna dan kata sandi Anda. Itu adalah shell bash login interaktif nyata. Anda dapat kembali ke shell grafis menggunakan Ctrl+Alt+F7.

Ada opsi --loginyang akan membuat bash berperilaku seolah-olah itu adalah shell login bahkan jika dimulai setelah Anda login. Mengkonfigurasi gnome-terminal untuk memulai bash sebagai shell login berarti bash akan mulai bash menggunakan --loginopsi.


Biasanya Anda ingin bash selalu membaca ~/.bashrcdalam shell interaktif. Inilah cara saya merekomendasikan untuk melakukan itu:

Buat ~/.bash_profilefile. Jika bash dimulai sebagai shell login, ia akan mencari terlebih dahulu ~/.bash_profilesebelum mencari ~/.profile. Jika bash menemukan ~/.bash_profilemaka itu tidak akan dibaca ~/.profile.

Masukkan baris berikut di ~/.bash_profile:

[ -f "$HOME/.profile" ] && source "$HOME/.profile"
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"

Sekarang jika bash dimulai sebagai shell login interaktif itu akan membaca file-file berikut:

  1. ~/.bash_profile
  2. ~/.profile
  3. ~/.bashrc

dan jika bash dimulai sebagai shell non-login interaktif:

  1. ~/.bashrc

Anda harus meletakkan barang-barang yang khusus untuk bash ~/.bashrcdan barang-barang yang tidak spesifik untuk bash di ~/.profile. Misalnya PATHmasuk ~/.profiledan HISTCONTROLmasuk ~/.bashrc.

Catatan yang ~/.profiletidak spesifik untuk bash. Kerang berbasis teks lainnya (misalnya sh atau ksh) dan kerang grafis (gnome) juga membaca ~/.profile. Itulah mengapa Anda tidak harus menempatkan barang-barang tertentu pesta di ~/.profile.

lesmana
sumber
1
+1. Terima kasih, ini mendorong saya ke atas tembok ... :-)
richsage
1
mywiki.wooledge.org/DotFiles menjelaskan beberapa sejarah mengapa itu seperti itu. Alasan utama untuk masalah ini dengan rvm adalah karena rvm menempatkan kode, yang seharusnya ada ~/.bashrcdi tempat pertama, di profil sebagai gantinya. Kesalahan ada di rvm.
geirha
Sesuai @geirha yang seharusnya mereka gunakan~/.profile
sanmai
Alasannya adalah bahwa skrip profil dapat mengontrol evaluasi .bashrcrelatif terhadap apa yang perlu dilakukan. Jika shell interaktif selalu membaca .bashrcapakah itu sebelum atau sesudah .profile? Bagaimana jika Anda ingin mengatur beberapa hal .bashrcyang .profiledianggap remeh? Dan pada saat yang sama Anda ingin beberapa hal .bashrcbergantung pada sesuatu yang diatur oleh .profile? Pesanan pemuatan tidak akan memenuhi kedua skenario.
Kaz
11

Ini bukan keputusan desain yang buruk, atau bug, atau perilaku yang diharapkan dari shell dan terminal

Ini hanyalah nilai default yang tidak menguntungkan dari opsi konfigurasi per-profil di Terminal Gnome, yang dapat Anda perbaiki dengan mudah.

  1. Pergi ke Edit -> Preferensi Profil .

  2. Pilih tab Judul dan Perintah .

  3. Perhatikan bagaimana perintah Jalankan sebagai kotak centang shell masuk tidak dicentang! Periksa.

Itu dia. Jika Anda melakukan ini pada Defaultprofil, atau ke profil apa pun yang dikonfigurasi untuk digunakan saat membuat terminal baru, Anda akan mendapatkan shell login.

Saya menduga bahwa di bawah tenda, opsi ini mungkin menyebabkannya meneruskan -lopsi ke shell.

Tamu
sumber
0

Saya memiliki pertanyaan yang sama, dan menemukan solusi: Cukup gunakan SSH untuk shell login yang sebenarnya!

1. Sebagai superuser, buat pengguna sistem rvm khusus untuk isolasi lengkap, dan berikan kata sandi:

sudo su

useradd -m rvmuser

passwd rvmuser

2. Instal dependensi agar rvm dapat membuat rubi tanpa meminta kata sandi superuser:

apt-get install curl gawk libreadline6-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake bison libffi-dev

3. SSH ke localhost untuk shell login asli (Anda mungkin harus apt-get install ssh)

ssh rvmuser@localhost

4. Instal rvm

\curl -sSL https://get.rvm.io | bash -s stable

5. Logout dan kembali lagi sehingga semua fungsi rvm dimuat

exit

ssh rvmuser@localhost

6. Gunakan rvm :)

Michael Franzl
sumber
0

Adalah umum ketika menggunakan bash untuk menempatkan inisialisasi profil .bash_profile, yang hanya dibaca oleh bash saat login, sedangkan cangkang lain telah dibagikan secara historis .profile. Ini memungkinkan Anda untuk menempatkan perintah spesifik bash di .bash_profile.

Penggunaan berikut ini biasanya dilakukan untuk menarik alias yang didefinisikan dalam .bashrc:

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
Rob Prentice
sumber