Di mana tempat yang disukai untuk mengatur PATH
envvar?
~/.profile
atau /etc/environment
?
Apa yang terjadi ketika PATH
diatur di kedua tempat? Apakah hasil akhirnya merupakan gabungan dari kedua nilai yang ditetapkan di kedua tempat tersebut?
environment-variables
paths
pkaramol
sumber
sumber
Jawaban:
Ringkasan:
Jika Anda ingin menambahkan jalur (mis.
/your/additional/path
) KePATH
variabel Anda hanya untuk pengguna saat ini dan tidak untuk semua pengguna komputer Anda, Anda biasanya meletakkannya di akhir~/.profile
seperti di salah satu dari dua contoh:Perhatikan bahwa prioritas jalur menurun dari kiri ke kanan, sehingga jalur pertama memiliki prioritas tertinggi. Jika Anda menambahkan path Anda di sebelah kiri
$PATH
, itu akan memiliki prioritas tertinggi dan executable di lokasi itu akan menimpa semua yang lain. Jika Anda menambahkan path Anda di sebelah kanan, itu akan memiliki prioritas terendah dan executable dari lokasi lain akan lebih disukai.Namun, jika Anda perlu mengatur bahwa variabel lingkungan untuk semua pengguna, saya akan tetap tidak merekomendasikan menyentuh
/etc/environment
tetapi menciptakan sebuah file dengan nama file yang berakhir dengan.sh
di/etc/profile.d/
. The/etc/profile
Script dan semua skrip di/etc/profile.d
adalah setara global masing-masing pengguna pribadi~/.profile
dan dieksekusi sebagai script shell biasa oleh semua kerang selama inisialisasi mereka.Lebih detail:
/etc/environment
adalah file konfigurasi seluruh sistem, yang berarti digunakan oleh semua pengguna. Itu dimiliki olehroot
, jadi Anda harus menjadi pengguna admin dan menggunakannyasudo
untuk memodifikasinya.~/.profile
adalah salah satu skrip inisialisasi shell pribadi pengguna Anda sendiri. Setiap pengguna memiliki satu dan dapat mengedit file mereka tanpa mempengaruhi orang lain./etc/profile
dan/etc/profile.d/*.sh
skrip inisialisasi global yang setara dengan~/.profile
untuk setiap pengguna. Namun skrip global dieksekusi sebelum skrip khusus pengguna; dan utama/etc/profile
mengeksekusi semua*.sh
skrip/etc/profile.d/
tepat sebelum keluar.The
/etc/environment
File biasanya hanya berisi baris ini:Ini mengatur
PATH
variabel untuk semua pengguna di sistem ke nilai default ini, yang tidak boleh diubah secara besar-besaran. Setidaknya Anda tidak harus menghapus salah satu jalur penting seperti/bin
,/sbin
,/usr/bin
dan/usr/sbin
dari itu.File ini dibaca sebagai salah satu file konfigurasi pertama oleh setiap shell dari setiap pengguna. Perhatikan bahwa ini bukan skrip shell . Ini hanya file konfigurasi yang akan diuraikan entah bagaimana dan itu mungkin hanya berisi tugas variabel lingkungan!
The
~/.profile
File dapat berisi banyak hal, secara default berisi antara hal-hal lain cek apakah~/bin
direktori ada dan menambahkan bahwa yang ada penggunaPATH
variabel, seperti ini (pada yang lebih tua rilis Ubuntu sebelum 16.04 - yang menambahkan hal itu tanpa syarat - dan pada 18,04 , yang juga menambahkan "~ / .local / bin"):Anda melihat bahwa nilai lama
PATH
akan digunakan kembali di sini dan jalur baru hanya ditambahkan ke permulaan alih-alih menimpa segalanya. Saat Anda secara manual ingin menambahkan jalur baru, Anda juga harus selalu menyimpan nilai lama$PATH
di suatu tempat di string baru.Skrip inisialisasi ini hanya dapat dibaca oleh cangkang pengguna yang dimiliki, tetapi ada syarat lain:
Jadi jika Anda menggunakan Bash shell default, Anda harus memastikan bahwa Anda tidak memiliki
~/.bash_profile
atau~/.bash_login
jika Anda ingin perubahan~/.profile
berpengaruh pada pengguna Anda.Untuk pemahaman penuh tentang Variabel Lingkungan, lihat: https://help.ubuntu.com/community/EnvironmentVariables
Pertanyaan terkait: perbedaan antara file bash.bashrc dan / etc / environment
sumber
~/.profile
ini tidak memeriksa keberadaan~/bin
, tetapi hanya memiliki garis:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
/etc/skel/.profile
di 16.04 memiliki garis yang saya sebutkan. Anda tampaknya menciptakan pengguna Anda di rilis sebelumnya.~/.profile
masih memiliki ini juga, tetapi Anda benar -/etc/skel/.profile
tidak memilikinya pada sistem 16.04 yang saya tingkatkan (dan akun pengguna dibuat saat menginstal 16.04 pada mesin lain tidak memilikinya di mereka.profile
).Tempat yang dipilih untuk diatur
PATH
tergantung pada pengguna yang Anda ingin atur dan kapan serta bagaimana Anda ingin mengaturnya. Bagian dari keputusan Anda adalah apakah Anda ingin set variabel lingkungan untuk semua pengguna atau berdasarkan per-pengguna. Jika Anda tidak yakin, maka saya sarankan mengaturnya hanya untuk satu pengguna (misalnya, akun Anda) daripada seluruh sistem.Seperti yang dikatakan AlexP ,
PATH
variabel lingkungan akan memiliki nilai yang ditugaskan paling baru . Dalam prakteknya, sebagian besar waktu Anda mengaturPATH
, Anda termasuk tua nilaiPATH
nilai baru, sehingga entri sebelumnya tetap dipertahankan.Dengan demikian, dalam praktiknya, ketika
PATH
diatur dari banyak file, biasanya berisi entri yang diberikan di semua file. Tapi itu hanya terjadi karena semua file yang mengaturnya, kecuali yang pertama, biasanya mereferensikanPATH
variabel itu sendiri, menyebabkan nilai lamanya dimasukkan yang baru.Oleh karena itu, Anda berlaku meminta urutan
PATH
pengaturan dalam berbagai file berlaku.Tempat umum dan tujuan umum untuk ditetapkan
PATH
tercantum di bawah ini dalam urutan di mana mereka berlaku saat pengguna masuk, bukan dalam urutan yang biasanya Anda pertimbangkan untuk menggunakannya . Masing-masing tempat yang tercantum di bawah ini adalah pilihan yang wajar untuk pengaturanPATH
dalam beberapa situasi , tetapi hanya beberapa yang merupakan pilihan yang baik sebagian besar waktu.Dalam daftar di bawah ini, Anda akan melihat beberapa nama direktori seperti
~/.profile
. Jika Anda tidak terbiasa dengan ekspansi tilde , lihat~/
direktori home pengguna saat ini. Saya terutama menggunakan sintaks ini untuk kekompakan. Ini didukung dalam skrip shell, tetapi tidak dalam file konfigurasi PAM.1. Untuk semua pengguna:
/etc/environment
PAM di Ubuntu menyebabkan variabel lingkungan yang tercantum di dalam
/etc/environment
diatur, jika file itu ada, yang secara default memang ada. Begitulah cara menetapkan variabel lingkungan untuk semua pengguna.Jika Anda harus mengatur variabel lingkungan untuk semua akun pengguna, bukan hanya akun pengguna Anda, maka memodifikasi file itu kemungkinan merupakan pilihan terbaik Anda. Saya sarankan mencadangkannya terlebih dahulu. Salah satu cara untuk membuat cadangan file ini adalah dengan menjalankan:
The
.orig
ekstensi tidak secara khusus diperlukan - Anda bisa merasa baik tentang penamaan apapun file cadangan yang tidak membingungkan atau sudah digunakan. (Selain.orig
,.old
,.backup
dan.bak
yang umum.)Anda dapat mengedit file ini di salah satu cara yang mungkin Anda mengedit file lain sebagai user root (
sudoedit /etc/enviromnment
,sudo nano -w /etc/environment
,gksudo gedit /etc/environment
, dll)/etc/environment
tidak mendukung termasuk nilai lama suatu variabel secara otomatis. Tapi ini biasanya tidak perlu, karena sebagian besar waktu Anda akan menetapkan variabel lingkungan untuk semua pengguna dengan mengedit/etc/environment
, Anda ingin itu menjadi nilai awal ketika pengguna login. Pengguna kemudian dapat mengubahnya sesuka mereka. Biasanya itu baik bagi pengguna untuk dapat melakukan ini.2. Untuk semua pengguna:
/etc/security/pam_env.conf
PAM membaca variabel lingkungan untuk semua pengguna dari
/etc/security/pam_env.conf
, ditentukan dengan sintaksis yang sama seperti yang digunakan dalam~/.pam_environment
file per-pengguna (lihat di bawah).Ketika variabel lingkungan yang sama diatur dalam keduanya
/etc/environment
dan/etc/security/pam_env.conf
, nilai dalampam_env.conf
digunakan - bahkan jika nilai tersebut ditentukan sebagaiDEFAULT
bukanOVERRIDE
.Namun, ketika Anda menggantikan satu baris
environment
dengan satupam_env.conf
, Anda dapat memasukkan konten dari nilai yang digantikan. Lihat bagian di bawah ini.pam_environment
untuk detail (karena menggunakan sintaks yang sama).Biasanya tidak perlu diedit
pam_env.conf
dan Anda harus sangat berhati-hati jika melakukannya , karena baris yang salah biasanya akan mencegah semua akun pengguna normal masuk sama sekali! Misalnya, defaultpam_env.conf
berisi baris:Ini disajikan sebagai salah satu dari beberapa contoh. Salah satu hal yang diilustrasikan adalah bagaimana membagi tugas di beberapa baris
\
. Misalkan Anda membatalkan komentar hanya pada baris pertama, tetapi lupa untuk menghapus komentar pada baris kedua:Jangan lakukan ini!
Saya baru saja mengujinya sendiri secara tidak sengaja, dan itu mencegah pengguna untuk berhasil masuk. Untuk memperbaikinya, saya harus boot dalam mode pemulihan dan mengubahnya kembali. (Untungnya saya melakukan ini pada mesin virtual yang saya gunakan hanya untuk menguji hal-hal, jadi itu tidak menyebabkan masalah bagi saya.)
3. Untuk satu pengguna:
.pam_environment
di direktori home penggunaSalah satu cara untuk mengatur variabel lingkungan untuk satu pengguna adalah agar pengguna itu mengedit (atau membuat)
.pam_environment
di direktori home mereka. Nilai yang ditetapkan dalam file ini menggantikan yang ditetapkan dalam/etc/environment
file global ..pam_environment
bukan bagian dari kerangka file yang disalin ke folder rumah pengguna saat akun pengguna awalnya dibuat. Namun, jika Anda membuat file itu di direktori home Anda, Anda dapat menggunakannya untuk mengatur variabel environment likePATH
. Tidak seperti/etc/environment
(tapi seperti/etc/security/pam_env.conf
), file per pengguna.pam_environment
mendukung perluasan nilai lama dari variabel lingkungan ke yang baru. Mereka bukan skrip shell, dan Anda harus menggunakan sintaks khusus untuk mencapai ini, yang agak berbeda dari sintaks yang akan Anda gunakan dalam file seperti.profile
.Misalnya, jika Anda memiliki
bin2
direktori di direktori home yang ingin Anda tambahkan di akhirPATH
, Anda bisa melakukannya dengan menambahkan baris ini ke.pam_environment
:Lihat yang
~/.pam_environment
ayat dari EnvironmentVariables (dari mana contoh di atas erat disesuaikan),man pam_env
danman pam_env.conf
untuk informasi lebih lanjut.Meskipun ini pernah disebut-sebut sebagai cara yang disukai bagi pengguna Ubuntu untuk mengubah atau menambahkan variabel lingkungan dan masih dianggap sebagai pilihan yang masuk akal dan dapat diterima, Anda harus berhati-hati saat mengedit
.pam_environment
. Seperti pengeditan ke seluruh sistem/etc/security/pam_env.conf
(lihat di atas), baris yang salah dalam.pam_environment
file pengguna akan mencegah login berhasil. (Saya telah menguji ini - dengan sengaja kali ini.) Untuk informasi tentang bagaimana rekomendasi telah berkembang , lihat komentar Gunnar Hjalmarsson di bawah ini dan diskusi ini .ubuntu-devel
Kesalahan seperti itu jauh lebih tidak serius, secara umum , daripada garis salah bentuk
pam_env.conf
, karena hanya mempengaruhi satu pengguna. Namun, dalam kasus sistem Ubuntu desktop dengan hanya satu akun pengguna yang memungkinkan login, kesalahan seperti itu saat mengedit.pam_environment
akan sama buruknya dengan mengedit kesalahanpam_env.conf
- jika Anda belum login, Anda tidak akan dapat untuk memperbaikinya tanpa mem-boot dalam mode pemulihan (atau dari USB langsung, dll.).(Jika Anda memiliki akun pengguna lain, maka Anda dapat masuk sebagai pengguna lain dan memperbaiki masalahnya. Meskipun mereka bukan administrator dan tidak dapat
sudo
melakukan rooting, mereka masih dapat berjalan dan diminta memasukkan kata sandi (bukan mereka) Anda . The tamu akun, bagaimanapun, tidak bisa melakukan ini, seperti yang dilarang menggunakan untuk mengambil identitas pengguna lain.)su your-account
su
4. Untuk semua pengguna:
/etc/profile
dan file di dalamnya/etc/profile.d/
bash
Shell yang kompatibel dengan Bourne (termasuk , shell pengguna default di Ubuntu) menjalankan perintah/etc/profile
ketika dipanggil sebagai shell login.Ubuntu
/etc/profile.d
berakhir dengan:Ini menyebabkan perintah dalam file apa pun di
/etc/profile.d/
direktori yang namanya berakhir.sh
juga dijalankan.Kebanyakan manajer tampilan menyebabkan perintah di
/etc/profile
(dan dengan demikian file dalam/etc/profile.d
) dijalankan untuk login grafis juga. Namun, tidak semua melakukannya, dan itu adalah argumen yang signifikan dalam mendukung penggunaan fasilitas yang disediakan oleh PAM (lihat di atas) - kecuali tidak akan pernah ada login grafis ke sistem ini, yang mungkin terjadi, misalnya, jika itu server tanpa GUI yang diinstal.Sudah menjadi kebiasaan untuk mengatur variabel lingkungan sistemwide
/etc/profile
, tetapi ini sering bukan pilihan terbaik lagi. Jika Anda tidak dapat mengatur variabel lingkungan/etc/environment
, dan Anda harus mengaturnya untuk semua pengguna, maka mungkin lebih baik untuk membuat file baru/etc/profile.d/
daripada mengedit/etc/profile
sendiri. Salah satu alasannya adalah ketika Ubuntu ditingkatkan, mungkin ada/etc/profile
file default baru . Bergantung pada bagaimana Anda melakukan upgrade, file lama (dengan perubahan Anda) akan disimpan, meninggalkan file konfigurasi yang diperbarui, atau Anda akan diminta untuk menangani situasi.Ketika variabel lingkungan yang sama diatur di kedua
/etc/profile
dan satu atau lebih file di/etc/profile.d
, yang dilakukan terakhir? Ini tergantung pada apakah perintah-perintah di/etc/profile
set itu muncul sebelum atau setelah file-file diprofile.d
-sumber (dengan kode yang saya kutip di atas). Perintah di/etc/profile
dieksekusi dalam urutan yang muncul./etc/profile
adalah skrip shell, dan sintaksinya tidak sama dengan yang ada pada file konfigurasi PAM yang dibahas di atas . Sintaksnya sama dengan sintaksis untuk file per pengguna~/.profile
(lihat di bawah).Jika Anda perlu menulis kode yang memutuskan apakah akan menambahkan direktori tertentu atau tidak
PATH
(dan melakukannya untuk semua pengguna), Anda tidak akan dapat menggunakan/etc/environment
atau/etc/security/pam_env.conf
melakukannya. Ini mungkin adalah situasi utama di mana lebih baik menggunakan/etc/profile
atau/etc/profile.d/
sebagai gantinya.5. Untuk satu pengguna:
.bash_profile
di direktori home penggunaJika seorang pengguna memiliki
~/.bash_profile
, bash menggunakannya sebagai ganti~/.profile
atau~/.bash_login
(lihat di bawah). Anda biasanya tidak harus memiliki.bash_profile
di direktori home Anda.Jika Anda melakukannya, biasanya harus berisi perintah ke sumber
~/.profile
(misalnya,. "$HOME/.profile"
). Jika tidak, konten file per pengguna.profile
tidak berjalan sama sekali.6. Untuk satu pengguna:
.bash_login
di direktori home penggunaJika seorang pengguna memiliki
~/.bash_login
, bash menggunakannya sebagai ganti~/.profile
(lihat di bawah), kecuali~/.bash_profile
ada, dalam hal ini tidak ada yang lain akan digunakan kecuali bersumber dari `~ / .bash_login.Seperti halnya
.bash_profile
, Anda biasanya tidak harus memiliki.bash_login
file di direktori home Anda.7. Untuk satu pengguna:
.profile
di direktori home pengguna.Ketika shell Bourne-style dijalankan sebagai shell login, itu menjalankan perintah di
/etc/profile
(yang biasanya mencakup perintah yang menyebabkan perintah dalam file/etc/profile.d/
dijalankan - lihat di atas). Setelah itu, ia menjalankan perintah di.profile
dalam direktori home pengguna. File ini terpisah untuk setiap pengguna. (Bash benar-benar berjalan.bash_profile
atau.bash_login
sebaliknya jika ada - tetapi, untuk pengguna pada sistem Ubuntu, file-file itu jarang ada atau memang ada. Untuk detailnya, lihat di atas dan 6.2 Bash Startup Files di manual Bash .)~/.profile
dengan demikian adalah tempat utama bagi pengguna untuk menempatkan perintah yang berjalan saat mereka masuk. Ini adalah tempat tradisional bagi Anda untuk mengaturPATH
, tetapi karena Ubuntu memiliki modul dan dukungan pam_env~/.pam_environment
, Anda harus mempertimbangkan untuk menggunakannya.Seperti halnya
/etc/profile
, tidak semua manajer tampilan menjalankan file ini untuk login grafis, meskipun sebagian besar melakukannya. Ini adalah alasan untuk lebih memilih~/.pam_environment
untuk menetapkan variabel lingkungan (sebanyak satu mungkin lebih memilih/etc/environment
untuk/etc/profile
).Anda dapat memperluas variabel lingkungan, termasuk
PATH
dirinya sendiri, ketika Anda mengaturPATH
di.pam_environment
(lihat di atas). Namun, jika Anda perlu mengaturPATH
dengan cara yang lebih canggih, Anda mungkin harus menggunakannya.profile
. Khususnya, jika Anda ingin memeriksa apakah direktori ada setiap kali pengguna masuk dan hanya menambahkannyaPATH
jika ada, maka Anda tidak akan dapat menggunakan.pam_environment
file Anda untuk menambahkan direktori itu ke direktori AndaPATH
.Misalnya, file per pengguna default
.profile
di Ubuntu digunakan untuk mengakhiri dengan:Lihat Gunnar Hjalmarsson 's komentar pada jawaban Byte Komandan untuk rincian.
Ini memeriksa apakah Anda memiliki
bin
subdirektori dari direktori home Anda. Jika demikian, ia menambahkan subdirektori itu ke awal blog AndaPATH
.Daftar itu menghilangkan beberapa kemungkinan.
Ada cara lain variabel lingkungan ditetapkan saat pengguna masuk yang lebih bergantung pada jenis login. Misalnya, Anda kadang-kadang mungkin memiliki variabel lingkungan yang ditetapkan hanya untuk login grafis atau hanya untuk login jarak jauh berbasis SSH. Daftar di atas tidak mencakup kasus-kasus seperti itu.
Saya telah meninggalkan beberapa file di mana orang kadang-kadang mendefinisikan variabel lingkungan, seperti
~/.bashrc
dan/etc/bash.bashrc
, karena mereka biasanya tidak direkomendasikan untuk diaturPATH
dan jarang Anda benar-benar menggunakannya untuk tujuan ini. Jika Anda menggunakan file-file ini untuk menambahkan direktoriPATH
, maka mereka kadang-kadang akan ditambahkan berkali-kali dan sangat membingungkan ketika Anda memeriksa$PATH
. (Dalam kasus ekstrim ini dapat memperlambat segalanya, tetapi biasanya ini hanya masalah menjaga semuanya bersih dan mudah dimengerti.)Karena
bash
shell login default Ubuntu untuk pengguna, dan sebagian besar pengguna menggunakannya atau shell yang kompatibel dengan POSIX lainnya, saya telah menghilangkan informasi tentang bagaimana variabel lingkungan diatur di shell lain, non-Bourne-style sepertitcsh
.sumber
/etc/environment
/~/.pam_environment
sebagai yang file direkomendasikan. Setelah berkonsultasi dengan pengembang saya mengubahnya menjadi netral antara PAM dan/etc/profile.d/*.sh
/~/.profile
, dan saya masih cenderung melihatnya seperti itu./etc/profile.d/*.sh
/~/.profile
adalah bahwa sintaksinya lebih sederhana dan lightdm / gdm bersifat memaafkan jika terjadi kesalahan (bahkan kesalahan sintaksis mencegah Anda untuk login, tetapi hanya menghasilkan pesan peringatan).pam_env.so
, apakah maksud Andapam_env.conf
?pam_env.conf
. Terima kasih! Saya telah mengeditnya untuk memperbaikinya./ etc / file environment bukan file skrip yang tidak dapat Anda gunakan ekspor di sana dan itu tidak mendukung ekspansi variabel dari tipe $ HOME, hanya simplevariable = pasangan nilai. Jadi untuk menggunakan file itu, Anda perlu menambahkan path Anda ke definisi yang ada, secara khusus dimaksudkan untuk pengaturan variabel lingkungan sistem-lebar. satu per baris. Secara khusus, file ini menyimpan pengaturan lokal dan path seluruh sistem.
~ / .profile - File ini dieksekusi setiap kali bash shell dieksekusi, biasanya yang direkomendasikan untuk variabel lingkungan, namun memiliki kelemahan hanya dipanggil oleh shell login, jadi untuk membuatnya berlaku Anda perlu untuk keluar dan kembali - atau setidaknya, mulai shell login baru.
sumber
Tempat yang disukai untuk menetapkan variabel lingkungan tergantung pada beberapa hal:
/etc/environment
karena tidak ada bahaya akses tanpa otorisasi./etc/environment
, tetapi~/.profile
masing-masing pengguna sistem karena itu terletak di direktori home masing-masing pengguna.Sistem akan membaca
/etc/environment
sebelum membaca~/.profile
. Tidak ada penggabungan terjadi dan seperti Alex P mengatakan tugas terakhir untuk path menang.Untuk melihat lebih detail faktor-faktor yang menentukan bagaimana
~/.profile
dan/etc/environment
bermain - main dengan lokasi lain, buka di sini dan di sini , karena faktor-faktor ini akan memengaruhi cara Anda menggunakan lokasi ini.sumber