Tampilan lengkap tempat variabel PATH diatur dalam bash

16

Saya telah membaca di beberapa tempat yang PATHdiatur /etc/profileatau .profilefile yang ada di direktori home.

Apakah ini satu-satunya tempat yang dilalui jalur? Saya ingin pemahaman yang lebih baik tentang itu.

Dalam /etc/profilefile tersebut, seperti komentar berikut mengatakan "system-wide .profile file for the Bourne shell". Apakah itu berarti bahwa file profil adalah file konfigurasi utama untuk bash?

Dalam file itu saya tidak melihat PATHvar diset sama sekali. Dalam .profilefile di direktori home ada baris ini:

PATH="$HOME/bin:$PATH"

Itu ulang PATHoleh tampilannya karena itu menggabungkan $PATHstring yang sudah ditetapkan dengan $HOME/bin:benar? Tetapi jika etc/profiledan ~/.profileapakah satu-satunya pengaturan file dari PATHmana $PATHasalnya dalam baris kode itu jika tidak didefinisikan di dalamnya /etc/profile?

Bisakah seseorang yang berpengalaman tolong berikan penjelasan yang luas dan terperinci tentang PATHvariabel tersebut? Terima kasih!

Larry Lawless
sumber

Jawaban:

19

Ada banyak tempat di mana PATHdapat diatur.

The loginProgram set ke nilai default. Bagaimana nilai default ini dikonfigurasi tergantung pada sistem. Pada sebagian besar sistem Linux yang tidak tertanam, ini diambil dari /etc/login.defs, dengan nilai yang berbeda untuk root dan untuk pengguna lain. Konsultasikan login(1)manual pada sistem Anda untuk mengetahui apa fungsinya.

Pada sistem yang menggunakan PAM , khususnya pam_envmodul, variabel lingkungan dapat diatur dalam file sistem-lebar /etc/environmentdan file per-pengguna ~/.pam_environment.

Maka sebagian besar cara untuk masuk (tetapi bukan pekerjaan cron) menjalankan shell login yang membaca file konfigurasi sistem dan per pengguna. File-file ini dapat mengubah nilai PATH, biasanya untuk menambah entri tetapi terkadang dengan cara lain. File mana yang dibaca tergantung pada apa shell login. Kerang Bourne / POSIX-style membaca /etc/profiledan ~/.profile. Bash membaca /etc/profile, tetapi untuk file per pengguna hanya membaca file pertama yang ada di antara ~/.bash_profile, ~/.bash_logindan ~/.profile. Zsh berbunyi /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zlogindan ~/.zlogin. Banyak sesi GUI yang mengatur pemuatan /etc/profiledan ~/.profile, tetapi ini tergantung pada manajer tampilan, pada lingkungan desktop atau skrip startup sesi lainnya, dan bagaimana setiap distribusi mengaturnya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
4

Variabel PATH awal biasanya ditetapkan dalam /etc/profile Kadang-kadang sys admin juga akan menempatkan variabel PATH ke sumber/etc/profile.d

Ini adalah sistem PATH vars yang setiap orang yang log in mewarisi secara default (kecuali ditunggangi secara lokal). Ini biasanya menetapkan jalur yang jelas, seperti /usr/bin, meskipun pada pekerjaan saya, kami menggunakan /optdan beberapa lokasi kustom secara luas, jadi itu ditetapkan juga di sana.

Pada akun basis login per pengguna, PATH juga dapat didefinisikan dalam ~/.profile. Itu mungkin mendefinisikan hal-hal yang tidak semua pengguna memiliki akses ke; mungkin kepala departemen dapat menjalankan binari dari /opttetapi pengguna lain tidak terganggu dengan binari tersebut. Pengguna dapat memodifikasi file itu sendiri juga, dan hal .profilebaiknya adalah tidak spesifik untuk shell; jika Anda masuk, PATH yang diatur di sana bersumber.

Untuk login shell khusus, PATH dapat didefinisikan dalam ~/.bash_profile, ~/.bashrcatau .cshrc, atau serupa. Pengguna dapat mengatur PATH di sini jika mereka menginginkan jalur khusus untuk shell tertentu, atau jika mereka kebetulan mempertahankan semua preferensi pribadi mereka di sana.

Singkatnya: / etc / profile dan /etc/profile.d adalah pengaturan cascading tradisional; mereka diwariskan dan biasanya ditambahkan ke dalam file-file pribadi (meskipun pengguna dapat memilih untuk menimpanya). File dot pribadi biasanya disetel oleh pengguna.

Tentu saja, shell juga memiliki variabel lingkungan, sehingga variabel lingkungan lokal juga dapat menambah atau menimpa PATH default di salah satu file konfigurasi.

Klaatu von Schlacker
sumber
Saya baru saja memeriksa semua file yang Anda sebutkan, ~ / .bash_profile dan .cshrc tidak ada. 3 file skrip di direktori /etc/profile.d: appmenu-qt5.sh, bash_completion.sh & vte.sh juga tidak mengatur variabel PATH. Apa yang Anda maksud dengan "shell juga memiliki variabel lingkungan" adalah PATH default ditetapkan dalam program biner / bin / bash? Ketika saya terminal echo $ PATH saya mendapatkan: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / game: / usr / local / games tapi saya tidak tahu di mana semua itu benar-benar diatur.
Larry Lawless
Saya pikir saya agak salah membaca pertanyaan Anda, saya pikir Anda meminta semua lokasi PATH dapat diatur, tapi saya pikir Anda lebih tertarik di mana PATH awalnya ditetapkan. Untuk itu, lihat /etc/bashrc. Ini menentukan bagaimana BASH diluncurkan, yang harus mencakup semua variabel lingkungan awal. Di sistem saya, /etc/bashrcbaca dari /etc/profile.dtetapi sepertinya Anda hanya memiliki 3 file /etc/profile.dsehingga distro Anda mungkin melakukannya secara berbeda.
Klaatu von Schlacker
1
Saya pada dasarnya ingin mengetahui seluk beluknya. Saya berharap Ken Thompson adalah ayah saya :)
Larry Lawless
Anda akan sampai di sana. Percayalah, setelah Anda menggunakan barang ini setiap hari untuk sementara waktu, semuanya mulai meresap, dan selama Anda terus bertanya "mengapa?" dan membaca dokumen untuk jawabannya, Anda akhirnya belajar banyak!
Klaatu von Schlacker
Di Linux Mint 18 Cinnamon pastikan untuk memeriksa /etc/profile.d/jdk_home.sh Saya mengubah nama file ini menjadi jdk_home.sh.old dan sekarang jalur saya tidak terus ditimpa dan saya dapat memanggil java -version dan melihat Java 9 sebagai diharapkan. Meskipun saya memilih Java 9 dengan benar di update-aternatives - config java file jdk_home.sh ini terus menimpa $ PATH
flyingdrifter
3

Untuk menambah jawaban lain:

bashakan ditetapkan PATHke nilai default hard-coded jika tidak disetel di lingkungan. Pada mesin Ubuntu Server 16.04.2, saya mendapatkan:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Kita dapat memeriksa bahwa nilai ini memang hard-coded, dan tidak dibaca dari lingkungan atau beberapa file, menggunakan stringsutilitas:

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Namun, saya mendapatkan hasil berbeda pada mesin Arch Linux saya:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

Jadi, sepertinya default ini dipilih pada saat bashbiner dibangun, yang tergantung pada OS / distribusi yang digunakan.

Vladimir Panteleev
sumber
0

Hal-hal yang tidak saya lihat:

Adapun Ken Thompson, Anda mungkin akan terkejut melihat: "Views on Linux" .

Rusi
sumber