Thêm một thư mục vào $ PATH trong CentOS?


84

Chúng tôi vừa có (các) máy chủ mới và chúng tôi đang chạy CentOS trên tất cả. Sau khi cài đặt thành công Ruby Enterprise Edition, bây giờ tôi muốn thêm thư mục REE / bin (đặt tại /usr/lib/ruby-enterprise/bin) để biến nó thành trình thông dịch Ruby mặc định trên máy chủ.

Tôi đã thử cách sau, chỉ thêm nó vào phiên shell hiện tại:

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

Điều gì sẽ là cách tiếp cận chính xác để thêm vĩnh viễn thư mục này vào $ PATH cho tất cả người dùng . Tôi hiện đang đăng nhập với quyền root.

Cảm ơn trước!

Câu trả lời:


116

Bạn không nên chỉnh sửa /etc/profilenhững thứ như thế này, vì bạn sẽ mất tất cả các thay đổi của mình mỗi khi CentOS xuất bản bản cập nhật cho tệp này. Đây chính xác /etc/profile.dlà những gì dành cho:

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

Đăng nhập lại và tận hưởng PATH được cập nhật (an toàn) của bạn:

# 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

Thay vì đăng nhập lại, bạn có thể tải lại hồ sơ:

# . /etc/profile

Điều này sẽ cập nhật các $PATHbiến.


1
~/.profilecũng là một tùy chọn hợp lệ khác
Zypher

4
Có, cho một người dùng. Nhưng câu hỏi là về việc thay đổi PATH cho tất cả người dùng.
Mike

2
@Mike Lệnh pathmunge này là gì?
Nickolai Leschov

@NickolaiLeschov Tôi khá chắc chắn rằng nó chỉ nối thêm một đường dẫn đến $ PATH.
Mike

@NickolaiLeschov đó là một chức năng được xác định trong / etc / profile
CrazyPheel 16/1/2015

11

Sau khi làm theo lời khuyên của fmonk, tôi đã kiểm tra /etc/bashrc, nơi tôi nhận thấy rằng "Công cụ môi trường đi vào / etc / profile." Tôi tiến hành nhìn vào /etc/profile, tôi thấy điều này:

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

Để giải quyết vấn đề của tôi, tôi chỉ cần thêm vào pathmunge /usr/lib/ruby-enterprise/binbên dưới câu lệnh if. Điều này đã giải quyết vấn đề của tôi.


Ai đó có thể giải thích những gì "$EUID" = "0"có nghĩa là trong bối cảnh này?
Eli

EUID 0 có nghĩa là người dùng đã root.
bbaja42

6
Bạn nên sử dụng /etc/profile.d. Xem câu trả lời của tôi dưới đây.
Mike

Vui lòng xem xét chấp nhận câu trả lời @MikeConigliaro là chính xác. Cách của anh ấy là đúng. Nó được phát triển để làm việc theo cách đó. Hãy xem các tập tin trong /etc/profile.d/thư mục và bạn sẽ nhận thấy nó. Ngoài ra, như ông nói, một bản cập nhật hệ thống có thể hoàn tác giải pháp của bạn.
Caio Cunha

4

"Shell đăng nhập tương tác được bắt đầu sau khi đăng nhập thành công, sử dụng / bin / login, bằng cách đọc tệp / etc / passwd. Lệnh gọi shell này thường đọc / etc / profile và tương đương riêng tư của nó ~ / .bash_profile khi khởi động.

Một shell không đăng nhập tương tác thường được bắt đầu tại dòng lệnh bằng cách sử dụng chương trình shell (ví dụ: [prompt] $ / bin / bash) hoặc bằng lệnh / bin / su. Một vỏ không đăng nhập tương tác cũng được bắt đầu với một chương trình đầu cuối như xterm hoặc konsole từ trong môi trường đồ họa. Kiểu gọi shell này thường sao chép môi trường cha và sau đó đọc tệp ~ / .bashrc của người dùng để biết thêm hướng dẫn cấu hình khởi động. " Http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

Do đó, tôi sẽ không đặt các biến môi trường trong bashrc, vì nó không chỉ chống lại quy ước chung, mà bạn cũng sẽ bỏ lỡ các biến bashrc của mình khi gọi một thiết bị đầu cuối từ môi trường Desktop đồ họa.

Trên Redhat trong /etc/profiletôi tìm thấy bình luận này:

"Các bí danh và hàm rộng của hệ thống nên đi vào / etc / bashrc. Các biến môi trường cá nhân và các chương trình khởi động nên đi vào ~ / .bash_profile. Các bí danh và hàm cá nhân nên đi vào ~ / .bashrc."

Vì vậy, nếu bạn muốn đặt các biến môi trường trên cơ sở người dùng, hãy thực hiện nó trong tệp .bash_profile của người dùng.

Hướng tới .bash_profiletôi đọc:

"Biến môi trường cá nhân và các chương trình khởi động.

Các bí danh và chức năng cá nhân nên có trong ~ / .bashrc. Các biến môi trường toàn hệ thống và các chương trình khởi động nằm trong / etc / profile. Các bí danh và hàm rộng của hệ thống nằm trong / etc / bashrc. "

Kết luận
Nếu bạn chỉ muốn root để xem các chương trình cư trú, ví dụ trong / sbinTôi sẽ thêm đường dẫn đó vào .bash_profiletập tin gốc . Nhưng nếu bạn muốn mọi người dùng xem những chương trình gốc cụ thể nào được cài đặt trên hộp của bạn, tôi sẽ đưa /sbinvào /etc/.profile. Bây giờ mọi người dùng có thể sử dụng hoàn thành tab để tìm kiếm các chương trình cụ thể gốc và nâng cao quyền nếu cần thiết.

Trường hợp đặc biệt: SSH
Khi ssh được bắt đầu bằng một dòng lệnh, một vỏ đăng nhập tương tác được bắt đầu. Nhưng trong trường hợp /etc/profilenày là không đọc. Khi tôi xác định các biến môi trường trong .bash_profiletệp của mỗi người dùng, nó đã làm việc với ssh.


2

SORRY đã giải thích sai câu hỏi của asnwer sau đây dành cho hồ sơ của NGƯỜI DÙNG để lại trong trường hợp nó giúp được ai đó

sửa đổi .bash_profile

nano ~/.bash_profile

sau đó ở đâu đó trong tệp thêm / sửa đổi đường dẫn của bạn được ngăn cách bởi:

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

sau đó tải lại hồ sơ của bạn

source ~/.bash_profile

hoặc đăng xuất và đăng nhập lại

nếu bạn kiểm tra PATH, nó sẽ bao gồm các đường dẫn mới được thêm vào của bạn

echo $PATH

1

Bạn có thể đặt các biến môi trường trong tệp .rc; đối với bash shell (tôi tin là phổ biến nhất và mặc định trong CentOS) mỗi người dùng có một tệp có tên .bashrc trong thư mục chính của mình.

Thêm lệnh PATH = / usr / lib / ruby-Enterprise / bin: $ PATH vào tệp này để đặt cho bất kỳ người dùng cụ thể nào.

Để đặt nó cho tất cả người dùng (như bạn đã đề cập), hãy thay đổi nó trong / etc / bashrc (.bashrc mặc định trong mỗi thư mục chính của người dùng nên lấy tệp này, nhưng bạn nên nhân đôi điều đó).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.