Menambahkan direktori ke $ PATH dalam CentOS?

84

Kami baru saja memasang server baru kami dan kami menjalankan CentOS pada semuanya. Setelah berhasil menginstal Ruby Enterprise Edition, sekarang saya ingin menambahkan /usr/lib/ruby-enterprise/bindirektori REE / bin (terletak di ) untuk menjadikannya interpreter Ruby default di server.

Saya telah mencoba yang berikut ini, yang hanya menambahkannya ke sesi shell saat ini:

export PATH=/usr/lib/ruby-enterprise/bin:$PATH

Apa yang akan menjadi pendekatan yang benar untuk menambahkan direktori ini secara permanen ke $ PATH untuk semua pengguna . Saya saat ini login sebagai root.

Terima kasih sebelumnya!

vonconrad
sumber

Jawaban:

116

Ini bukan ide yang baik untuk mengedit /etc/profilehal-hal seperti ini, karena Anda akan kehilangan semua perubahan Anda setiap kali CentOS menerbitkan pembaruan untuk file ini. Inilah tepatnya /etc/profile.duntuk:

# echo 'pathmunge /usr/lib/ruby-enterprise/bin' > /etc/profile.d/ree.sh
# chmod +x /etc/profile.d/ree.sh

Masuk kembali dan nikmati PATH Anda yang diperbarui (aman):

# echo $PATH
/usr/lib/ruby-enterprise/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# which ruby
/usr/lib/ruby-enterprise/bin/ruby

Alih-alih masuk kembali, Anda dapat memuat ulang profil:

# . /etc/profile

Ini akan memperbarui $PATHvariabel.

Mike
sumber
1
~/.profileadalah pilihan lain yang valid juga
Zypher
4
Ya, untuk satu pengguna. Tetapi pertanyaannya adalah tentang mengubah PATH untuk semua pengguna.
Mike
2
@ Mike Apa perintah pathmunge ini?
Nickolai Leschov
@NickolaiLeschov Saya cukup yakin itu hanya menambahkan path ke $ PATH.
Mike
@NickolaiLeschov, ini adalah fungsi yang didefinisikan di / etc / profile
CrazyPheel
11

Setelah mengikuti saran fmonk saya check out /etc/bashrc, di mana saya perhatikan itu mengatakan bahwa "Hal-hal lingkungan masuk / etc / profile." Saya melanjutkan untuk melihat /etc/profile, saya melihat ini:

pathmunge () {
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
       if [ "$2" = "after" ] ; then
          PATH=$PATH:$1
       else
          PATH=$1:$PATH
       fi
    fi
}

[...]

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
fi

Untuk mengatasi masalah saya, saya cukup menambahkan di pathmunge /usr/lib/ruby-enterprise/binbawah pernyataan if. Ini menyelesaikan masalah saya.

vonconrad
sumber
Bisakah seseorang menjelaskan apa "$EUID" = "0"artinya dalam konteks ini?
Eli
EUID 0 berarti pengguna itu root.
bbaja42
6
Anda seharusnya menggunakan /etc/profile.d. Lihat jawaban saya di bawah ini.
Mike
Silakan mempertimbangkan menerima jawaban @MikeConigliaro sebagai jawaban yang benar. Jalannya adalah yang benar. Ini dikembangkan untuk bekerja seperti itu. Lihatlah file-file di /etc/profile.d/folder dan Anda akan melihatnya. Juga, seperti katanya, pembaruan sistem dapat membatalkan solusi Anda.
Caio Cunha
4

"Shell login interaktif dimulai setelah login berhasil, menggunakan / bin / login, dengan membaca file / etc / passwd. Doa shell ini biasanya membaca / etc / profile dan private equivalents ~ / .bash_profile saat startup.

Shell non-login interaktif biasanya dimulai pada baris perintah menggunakan program shell (misalnya, [prompt] $ / bin / bash) atau dengan perintah / bin / su. Shell non-login interaktif juga dimulai dengan program terminal seperti xterm atau konsole dari dalam lingkungan grafis. Jenis doa shell biasanya menyalin lingkungan induk dan kemudian membaca file ~ / .bashrc pengguna untuk instruksi konfigurasi startup tambahan. " Http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

Oleh karena itu saya tidak akan meletakkan variabel lingkungan di bashrc, karena tidak hanya bertentangan dengan konvensi umum, tetapi Anda juga akan kehilangan variabel bashrc Anda ketika memanggil terminal dari lingkungan Desktop grafis.

Pada Redhat di /etc/profilesaya menemukan komentar ini:

"Alias ​​dan fungsi lebar sistem harus masuk ke / etc / bashrc. Variabel lingkungan pribadi dan program startup harus masuk ke ~ / .bash_profile. Alias ​​dan fungsi pribadi harus masuk ke ~ / .bashrc."

Jadi jika Anda ingin mengatur variabel lingkungan berdasarkan pengguna, lakukan di file .bash_profile pengguna.

Menuju ke .bash_profileSaya membaca:

"Variabel lingkungan pribadi dan program startup.

Alias ​​dan fungsi pribadi harus masuk ~ / .bashrc. Variabel lingkungan sistem yang luas dan program startup berada di / etc / profile. Alias ​​dan fungsi di seluruh sistem ada di / etc / bashrc. "

Kesimpulan
Jika Anda hanya ingin root untuk melihat program yang berada, misalnya di / sbinsaya akan menambahkan path ke .bash_profilefile root . Tetapi jika Anda ingin setiap pengguna untuk melihat program root apa yang diinstal pada kotak Anda, saya akan dimasukkan /sbinke dalam /etc/.profile. Sekarang setiap pengguna dapat menggunakan penyelesaian tab untuk mencari program khusus root dan meningkatkan hak jika perlu.

Kasus Khusus: SSH
Ketika ssh dimulai dengan baris perintah, shell login interaktif dimulai. Tetapi dalam hal /etc/profileini tidak dibaca. Ketika saya mendefinisikan variabel lingkungan di .bash_profilefile setiap pengguna itu bekerja dengan ssh.

lapangan mesh
sumber
2

SORRY salah mengartikan pertanyaan asnwer berikut untuk profil PENGGUNA meninggalkannya seandainya itu membantu seseorang

ubah .bash_profile

nano ~/.bash_profile

lalu di suatu tempat dalam file tambahkan / modifikasi jalur Anda dipisahkan oleh:

 PATH=$PATH:$HOME/bin:/your/path
 export PATH

lalu muat ulang profil Anda

source ~/.bash_profile

atau logout dan login lagi

jika Anda memeriksa PATH itu harus menyertakan jalur Anda yang baru ditambahkan

echo $PATH
GiorgosK
sumber
1

Anda dapat mengatur variabel lingkungan dalam file .rc; untuk bash shells (saya percaya yang paling umum, dan default di CentOS) setiap pengguna memiliki file bernama .bashrc di direktori rumahnya.

Tambahkan perintah PATH = / usr / lib / ruby-enterprise / bin: $ PATH ke file ini untuk mengaturnya untuk setiap pengguna tertentu.

Untuk mengaturnya untuk semua pengguna (seperti yang Anda sebutkan), ubah di / etc / bashrc (.bashrc default di direktori home masing-masing pengguna harus sumber file ini, tetapi Anda harus memeriksa dua kali itu).


sumber