/ etc / profile tidak bersumber


45

Untuk 11,04, saya melakukan instalasi baru sistem saya. Bagian dari instalasi itu adalah untuk menginstal rvm , yang merupakan stick rvm.shin /etc/profile.d/. Ini tidak berfungsi karena /etc/profile(yang memuat masing-masing + r /etc/profile.d/*.sh) tidak sedang dimuat. Menurut dokumentasi, profil hanya bersumber jika bash dijalankan saat login. Untuk memverifikasi ini, saya meminta bash --login, setelah rvmitu tersedia.

Ini berhasil bagi saya di versi Ubuntu sebelumnya tanpa konfigurasi apa pun. Artinya, instalasi baru 10.10 akan dengan benar sumber profil / .d.

Pertanyaan saya adalah: adakah yang saya lakukan salah, atau adakah asumsi baru yang dibuat pada Natty yang telah mematahkan ini? Solusi saya saat ini adalah untuk source /etc/profilemasuk ~/.bashrc(yang mengerikan karena profil dimaksudkan untuk memuat sebelum bashrc, tetapi lakukan triknya).

Jawaban:


52

Per default, terminal gnome tidak memulai bash sebagai shell login (saya berasumsi maksud Anda bash dimulai di dalam terminal gnome). Itu artinya bash tidak akan membaca /etc/profileatau ~/.profile. Seperti yang telah Anda amati dengan benar, bash akan membaca file-file tersebut jika dimulai sebagai shell login.

Perbaikan cepat untuk masalah Anda adalah mengkonfigurasi gnome-terminal untuk memulai bash sebagai shell login sehingga ia akan membaca /etc/profile. Untuk melakukan itu, Anda harus mengaktifkan "Jalankan Perintah sebagai shell login" di terminal gnome "Preferensi Profil" yang dapat dijangkau dari menu Edit.

Saya tidak merekomendasikan melakukan ini karena mengacaukan perbedaan antara ~/.profiledan ~/.bashrc. Idealnya ~/.profileharus melakukan hal-hal yang diperlukan hanya sekali, saat login, sementara ~/.bashrcharus melakukan hal-hal yang diperlukan setiap kali pesta dimulai.

Ada pertanyaan dan jawaban di superuser yang berbicara tentang perbedaan antara bashrc dan profil . Baca di sana untuk informasi lebih lanjut.

Dari uraian masalah Anda, sepertinya skrip rvm hanya perlu dimuat satu kali, saat login. Sejauh yang saya tahu Ubuntu telah mengkonfigurasi login grafis untuk membaca /etc/profile/dan ~/.profile. Itu berarti, setelah logout dan login sekali, skrip rvm harus aktif. Jika masih tidak berhasil, mungkin skrip rvm perlu dimuat untuk setiap sesi bash. Jika itu masalahnya maka bashrcmerupakan tempat yang lebih tepat untuk skrip.


Pengaturan 'jalankan perintah sebagai shell login' memang memuat /etc/profile(dan dengan demikian .d's). Terima kasih atas penjelasannya - sepertinya ini membutuhkan tindak lanjut dengan rakyat rvm.
Marc

7
Ubuntu 11.04 sepertinya tidak membaca /etc/profiledan ~/.profileselama login. Ini aneh karena selalu bekerja dengan versi yang lebih lama. Saya pikir ini bukan solusi tetapi solusi.
Luca

2
@lesmana Apakah ada cara saya bisa mengaktifkan "Jalankan Perintah sebagai shell login" dari CLI, bukan GUI? Saya sshed ke server jauh dan tidak bisa meneruskan X secara lokal.
Waseem

5

Namun, ada file /etc/bash.bashrc yang dibaca oleh gnome-terminal dan merupakan ".bashrc file sistem-lebar untuk shell bash (1) interaktif."

Panggilan saya ke fungsi rvm [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm",, masuk ke sana, dan berfungsi dengan baik untuk beberapa pengguna di sistem itu.


gnome-terminal tidak melakukan hal semacam itu. gnome-terminal menjalankan bash (atau apa pun shell login Anda diatur ke dalam database passwd) dalam mode interaktif, dan bash mulai membaca secara interaktif /etc/bash.bashrc. Ya, setidaknya di Debian / Ubuntu. Bash biasanya tidak membaca sistem bashrc lebar; debian telah menambalnya untuk melakukannya.
geirha

@geirha: dmitri @ Eos: ~ $ uname -a Linux Eos 3.0.0-16-generic # 29-Ubuntu SMP Sel pada 14 Februari 12:48:51 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux dmitri @ Eos: ~ $ cat / etc / bash.bashrc # File .bashrc di seluruh sistem untuk shell bash (1) interaktif. # Untuk mengaktifkan pengaturan / perintah dalam file ini untuk shell login juga, # file ini harus bersumber di / etc / profile. # Jika tidak berjalan secara interaktif, jangan lakukan apa pun [-z "$ PS1"] && kembali .....
Dmitri

2
Ya, jelas, terminal gnome memanggil bash untuk membaca file itu: jika shell Anda adalah ksh, maka terminal gnome tidak akan membaca file itu, bukan? Bolehkah saya menyarankan mencari kata "pedant" dalam kamus sebelum Anda terus menggunakan frasa provokatif seperti "tidak melakukan hal semacam itu."
Dmitri

4

Menginstal RVM sebagai multiuser mengharuskan pengguna untuk menjalankan perintah ini:

(karena Ubuntu tidak sumber /etc/profile.d saat login)

echo '[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function' >> ~/.bashrc

3
Ubuntu tidak sumber file dalam /etc/profile.d/saat login karena default /etc/profileloop melalui, dan sumber, file dalam /etc/profile.d/. Namun, jika ini rvm.shberisi kode untuk shell interaktif, seperti fungsi atau alias, memiliki sumber /etc/profiletidak ada gunanya. Persiapan untuk sesi bash interaktif harus ada di .bashrc.
geirha

0

jika Anda memiliki ZSH atau OH-MY-ZSH, profil Anda adalah / etc / zprofile


0

Saya telah benar-benar menemukan bagi mereka yang tidak suka me-restart sepenuhnya kotak mereka kecuali itu benar-benar diperlukan sebagai berikut ...

Anda tidak perlu me-restart seluruh mesin agar perubahan /etc/profilediterapkan. Yang Anda perlukan hanyalah membuat XWindows Desktop GUI Anda restart sehingga membaca ulang konfigurasi (seperti jika dimulai sebagai bagian dari restart seluruh sistem).

Bagi saya, saya menggunakan xUbuntu yang menggunakan LightDM tetapi Anda dapat memasukkan apa pun yang dapat dieksekusi memanggil desktop Anda saat ini.

Pertama, Anda tidak dapat menggunakan emulator terminal dari dalam GUI desktop itu sendiri untuk melakukan ini (setidaknya tidak dengan LightDM) Anda harus menggunakan SSH atau konsol sekunder (jika Anda menahan Ctrl + Alt dan menekan F Key atau tombol angka Anda harus meninggalkan login atau layar desktop grafis Anda ke jendela terminal biasa). Saya juga menyarankan Anda untuk menutup semua hal-hal desktop jarak jauh seperti VNC jika Anda menggunakan SSH (jelas SSH dapat dihubungkan, Anda hanya tidak ingin jendela VNC terbuka menjadi polling display 0 saat sedang mencoba untuk me-restart karena ini mungkin menggantung restart saat ini menunggu Anda untuk mengakhiri sesi VNC).

Saya melakukan ini sepanjang waktu dengan SSH dan ini adalah penyelamat besar terutama ketika Anda tidak secara fisik oleh mesin Anda dan tidak merasa seperti menunggu untuk restart penuh dan menghubungkan kembali :-D

Sekarang bagian yang mudah sekali di terminal "sekunder" atau masalah SSH: (Ya, ini akan mematikan sesi Anda saat ini, pastikan Anda tidak keberatan, simpan dokumen yang terbuka atau bekerja)

sudo service lightdm restart

tunggu sebentar karena itu membunuh desktop dan kemudian memulainya lagi (ini bisa memakan waktu beberapa detik karena semuanya dihentikan dan kemudian dijalankan lagi saat mulai)

Itu saja, sekarang ketika Anda kembali ke konsol 0 atau pergi ke menggunakan VNC untuk menghubungkan lagi, Anda akan disambut oleh prompt login dan login seperti biasa dan jika Anda membuka terminal emulator dan pergi untuk mengeluarkan perintah Anda, sekarang Anda seharusnya sekarang tidak memiliki masalah karena semuanya dipasok kembali seperti halnya Anda melakukan restart mesin penuh.

Ingat saja, jika Anda mengeluarkan sudo service lightdm restart[atau stop, startapa pun] dari dalam lingkungan desktop itu sendiri menggunakan emulator terminal, perintah itu hanya akan bertahan di sana dan tampaknya tidak akan terjadi apa-apa. Ini karena Anda saat ini menggunakan konsol itu (tampilan alias) 0 sehingga tidak dapat sepenuhnya turun dan kembali ke atas karena menunggu desktop tidak digunakan sebelum menjalankan perintah.

Catatan Terakhir: Saya belum mencoba mengeluarkan restart pada lingkungan dari dalam desktop di terminal emulator dan kemudian beralih ke konsol lain yang kemudian me-restart itu, tetapi jika Anda sudah akan beralih konsol maka mengapa tidak jalankan perintah dari sana sebagaimana mestinya lagian?


-4

echo ". .profile" >> ~ / .bashrc

Dan kemudian buka jendela lain. Saya pikir ini adalah pendekatan yang mudah.


1
Karena .profilesumber default .bashrc, ini akan menghasilkan loop untuk sebagian besar pengguna.
muru
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.