File setup mana yang harus digunakan untuk mengatur variabel lingkungan dengan bash?

9

Ketika saya bertanya dan mendapat jawaban di sini , dan di sini , variabel PATH memiliki nama jalur yang berbeda tergantung pada bagaimana aplikasi diaktifkan.

  • File setup (.bashrc, .profile, ...) mana yang harus digunakan untuk memiliki variabel PATH yang sama tidak peduli bagaimana saya memulai perangkat lunak dengan bash?
prosseek
sumber

Jawaban:

15

Secara tradisional, tempat untuk mendefinisikan variabel lingkungan per pengguna pada sistem unix adalah ~/.profile. File ini dibaca oleh shell login (yaitu program yang dimulai ketika Anda masuk, dan Anda dapat mengetik perintah ke dalam), asalkan shell login adalah shell yang kompatibel dengan Bourne.

Bash adalah shell yang kompatibel dengan Bourne. Ketika dipanggil sebagai shell login membaca ~/.bash_profilejika file ini ada, dan ~/.profilejika ~/.bash_profiletidak ada.

Sebagai aturan praktis, jika Anda mengetikkan kata sandi dalam mode teks (misalnya, pada konsol teks, atau dari jarak jauh dengan ssh), maka shell yang Anda dapatkan adalah shell login.

Namun, jika Anda mengetikkan kata sandi di program grafis dan masuk ke lingkungan grafis, ini memintas shell login normal. Apakah .profiledibaca dalam kasus ini tergantung pada bagaimana sesi grafis diatur; misalnya itu bervariasi antara distribusi Linux, antara manajer tampilan dan antara lingkungan desktop. Terkadang salah satu program dalam rantai secara eksplisit memanggil shell login; terkadang salah satu program membaca secara eksplisit ~/.profile; dan kadang-kadang semua ini tidak terjadi dan ~/.profiletidak dapat dibaca.

Untuk memberikan contoh variabilitas, sejauh yang saya tahu dari sekilas pada skrip yang terlibat, di Ubuntu 10,04: jika Anda masuk dengan kdm atau lxdm, ~/.bash_profilebaca apakah ada, dan ~/.profilesebaliknya; jika Anda masuk dengan gdm, hanya ~/.profiledibaca; jika Anda masuk dengan xdm, ~/.profiletidak dibaca.

Semua sistem yang saya tahu menyediakan beberapa cara untuk mengatur variabel lingkungan per pengguna. Sayangnya tidak ada jawaban umum.

Perhatikan bahwa kadang-kadang Anda akan melihat rekomendasi untuk mengatur variabel lingkungan ~/.bashrc, atau memulai shell login di setiap terminal dalam lingkungan GUI. Keduanya adalah ide yang buruk; salah satu alasannya adalah masalah yang Anda alami, yaitu bahwa variabel lingkungan Anda hanya tersedia dalam program yang dimulai melalui terminal, dan tidak dalam program yang dimulai secara langsung dengan ikon atau menu atau pintasan keyboard.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Beberapa aplikasi mengaktifkan shell non-login interaktif, yang berarti .profile dan .bash_profile tidak dibaca. Jika Anda ingin mengatur env vars untuk aplikasi-aplikasi itu, salah satu cara untuk melakukannya adalah dengan mengaturnya di .bashrc meskipun itu tidak seharusnya menjadi tempat untuk itu; lihat github.com/mobile-shell/mosh/issues/102#issuecomment-12503646
William
@ William .profiledibaca ketika Anda masuk. Menempatkan variabel lingkungan .bashrctidak berfungsi, dan skenario Anda menggambarkan bahwa: (mungkin GUI) aplikasi yang menjalankan shell ini harus memiliki variabel lingkungan Anda, tetapi jika Anda mendefinisikannya .bashrc, itu tidak t.
Gilles 'SANGAT berhenti menjadi jahat'
mosh bukan GUI, ini alternatif untuk ssh. Saya tidak membela perilakunya, hanya mencoba membantu orang lain yang mengalami masalah yang sama dengan saya dan orang lain, seperti yang dijelaskan dalam masalah Github yang saya tautkan.
William
2

Jawaban pasti ada di bagian bash man page di Bash Startup Files . "Ketika shell interaktif yang bukan shell login dimulai, Bash membaca dan mengeksekusi perintah dari ~ / .bashrc, jika file itu ada."

Jawaban pertanyaan Anda lainnya menunjukkan bahwa eshell tidak benar-benar berjalan bash. Emacs eshelltidak bash. Dengan asumsi bahwa eshellmemuat akan .bashrcsama salahnya dengan menganggap zshatau cshmemuat .bashrc. Ini shell yang berbeda.

Saya melihat dua opsi:

  1. Buat skrip Anda sendiri yang mengambil daftar direktori dan menghasilkan kode bash yang sesuai untuk bashdan kode elisp eshell.
  2. Setel variabel lingkungan ESHELL atau SHELL Anda sehingga Anda benar - benar menjalankan bash di dalam emacs. Itu yang saya lakukan. Bash bekerja dengan baik di emacs.

Anda mungkin juga tertarik dengan diskusi tentang menambahkan direktori ke jalur tanpa duplikat .

Doug Harris
sumber
1

Mengatur PATH Anda di profil ~ / .harus berhasil. File itu dibaca saat login oleh setiap shell yang sesuai dengan POSIX atau Bourne yang saya tahu termasuk bash. Jika Anda membuat perubahan pada file itu, Anda harus keluar dan masuk kembali agar perubahan diterapkan. Karena PATH adalah bagian dari lingkungan proses login Anda, itu harus diekspor ke setiap shell yang Anda mulai selanjutnya.

garyjohn
sumber