Làm cách nào để đặt biến môi trường người dùng? (vĩnh viễn, không phải phiên)


145

Điều này gây khó chịu cho tôi. Tôi đã thấy một số đề xuất (tất cả sử dụng các tệp và cú pháp khác nhau) và không có gợi ý nào trong số chúng hoạt động.

Làm cách nào để đặt biến môi trường cho một người dùng cụ thể? Tôi đang trên bóp bóp. Cú pháp chính xác tôi nên đặt trong tệp để tạo ABC = "123" là gì?


7
Bạn đã thử những gì?
l0b0

1
chỉnh sửa .bashrc, .bash_profile, .profile và .ssh / eviroment. Mặc dù tôi không biết liệu tôi đã viết nó ở đúng vị trí hay có cú pháp đúng mỗi lần

4
.bashrclà nơi chính cho điều đó.
rozcietrzewiacz

@rozcietrzewiacz: ok nhưng ... ngay cả sau khi có giải pháp tôi đã thử đặt ABC1 và ABC2 ở đầu và cuối tập tin đó và nó không được đặt trong môi trường của tôi.

1
Kiểm tra .bash_profilecó chứa một cái gì đó như [[ -f ~/.bashrc ]] && . ~/.bashrc.
rozcietrzewiacz

Câu trả lời:


113

Bạn phải đặt khai báo trong các tệp khởi tạo của trình bao của bạn:

  • Nếu bạn đang sử dụng bash, ash, ksh hoặc một số shell kiểu Bourne khác, bạn có thể thêm

    ABC="123"; export ABC
    

    trong .profiletập tin của bạn ( ${HOME}/.profile). Đây là tình huống mặc định trên hầu hết các cài đặt Unix và đặc biệt là trên Debian.

    Nếu shell đăng nhập của bạn là bash, bạn có thể sử dụng .bash_profile( ${HOME}/.bash_profile) hoặc .bash_loginthay vào đó.

    Lưu ý: Nếu một trong hai tệp này tồn tại và vỏ đăng nhập của bạn bị bash, .profilesẽ không được đọc khi bạn đăng nhập qua ssh hoặc trên bảng điều khiển văn bản, nhưng nó vẫn có thể được đọc thay vì .bash_profilenếu bạn đăng nhập từ GUI. Ngoài ra, nếu không có .bash_profile, sau đó sử dụng .bashrc.

  • Nếu bạn đã đặt zsh làm vỏ đăng nhập, hãy sử dụng ~/.zprofilethay vì ~/.profile.

  • Nếu bạn đang sử dụng tcsh, hãy thêm

    setenv ABC "123"
    

    trong .logintập tin ( ${HOME}/.login)

  • nếu bạn đang sử dụng shell khác, hãy xem hướng dẫn sử dụng shell làm thế nào để xác định các biến môi trường và tệp nào được thực thi khi khởi động shell.


5
Hành vi mặc định của su userlà thay đổi quyền sở hữu của shell hiện tại thành tên người dùng arg, trong khi vẫn giữ thư mục chính và môi trường của người dùng gọi. Để nhập shell theo cách trở thành người dùng mới và đạt được tất cả các cài đặt môi trường của họ ($ PATH, $ HOME, $ ABC, v.v.), bạn cần phải vượt qua - như là đối số đầu tiên cho su. su - usernamesẽ hoàn thành những gì bạn đang yêu cầu.
Tim Kennedy

1
Đợi đã: ý của bạn là "thoát ra khỏi gốc" là gì? Trong mọi trường hợp, việc tạo một 'su' không khởi tạo trình bao. Bạn cần 'su -' (xem man su)
Matteo

1
Tại sao bạn suở nơi đầu tiên? Không phải bạn vừa tạo một sở hữu gốc .profilemà người dùng không thể sử dụng sao?
rozcietrzewiacz

1
@acid đây là điều nên làm. Câu hỏi là, cái gì có nguồn gốc khi bạn đăng nhập. Để kiểm tra, hãy đăng xuất trước.
rozcietrzewiacz

7
.profileđược đọc bởi tất cả các shell tương thích Bourne, bạn không nên viết cú pháp Bash trong tệp đó. Đặc biệt, export VARIABLE=valuecần phải được tái cấu trúc thành VARIABLE=value; export VARIABLE.
tripleee

48

Sử dụng /etc/environmenttập tin để thiết lập các biến môi trường. Sau đó thêm dòng sau vào /etc/environmenttập tin.

ABC="123"

Bây giờ biến ABC sẽ có thể truy cập được từ tất cả các phiên người dùng. Để kiểm tra đầu ra biến trước tiên hãy làm mới biến môi trường bằng lệnh

source /etc/environment

và chạy echo $ABC.


4
+1 cho lệnh nguồn. Điều đó đã bị thiếu trong tất cả các câu trả lời
Nerrve 29/03/13

5
Hãy cẩn thận mà /etc/environmentkhông hỗ trợ cú pháp bash đầy đủ, một cái gì đó tôi đã tìm ra một cách khó khăn. Ví dụ: đặt PATH="/usr/bin:/usr/sbin"và sau đó thực hiện PATH="$PATH:/foo/bar"trên một dòng sau sẽ không hoạt động
user2428118

Không chắc đây có phải là sự cố cá nhân hay không, nhưng tôi đã phải khởi động lại hệ điều hành của mình sau khi cài đặt hệ thống này /etc/environment, ngay cả khi tôi khởi động lại thiết bị đầu cuối bash hoặc gõ source /etc/environment. Vì vậy, nếu bạn gặp vấn đề trong đó biến môi trường không tồn tại lâu, hãy thử khởi động lại.
Blairg23

9

Đây là một thủ tục chung mà bạn có thể sử dụng cho khá nhiều vỏ. Trong mọi trường hợp, bạn phải biết người dùng thường đăng nhập với shell nào:

path="$(grep $USER /etc/passwd | cut -d ':' -f 7)"
shell="$(basename -- "$path")"

Sau đó, bạn phải tìm ra tệp chấm nào mà shell này thường đọc:

man $shell

Một phím tắt có thể hoạt động là liệt kê các tệp chấm chứa tên shell:

ls ~/.*${shell}*

Nếu bạn muốn kiểm tra xem một trong các tệp có thực sự được đọc trong quá trình đăng nhập hay không, bạn chỉ cần in tên tệp trong mỗi tệp, ví dụ:

echo .bashrc

Khi đăng nhập, bạn sẽ thấy tập tin nào đang được đọc và bạn có thể quyết định tập tin nào cần sửa đổi. Xin lưu ý rằng bạn không nên cố gắng sử dụng echo "$0"hoặc tương tự, bởi vì giá trị $0phụ thuộc vào cách shell xử lý các tệp chấm và có thể gây hiểu nhầm.

Khi nói đến việc khai báo biến "vĩnh viễn", lưu ý rằng điều này chỉ kéo dài đến phiên. Không có cách nào để truy cập giá trị của một biến mà không có phiên, vì vậy nó không có ý nghĩa gì ngoài một biến. Nếu bạn có nghĩa là "chỉ đọc", đó là phụ thuộc shell và trong Bash bạn có thể sử dụng:

declare -r VAR

nếu nó đã có giá trị, hoặc

declare -r VAR=value

để gán nó cùng một lúc. Không phải tất cả các vỏ đều có tính năng này.

Để khai báo một biến trong hầu hết các shell, bạn nên sử dụng tên biến ( [A-Za-z_][A-Za-z0-9_]*), theo sau là dấu bằng (và không có khoảng trắng xung quanh dấu bằng), sau đó là một giá trị (tốt nhất là trích dẫn trừ khi giá trị là đơn giản [A-Za-z0-9_]+). Ví dụ:

name="John Doe"
ip=127.0.0.1
HORRIBLE=1

5

Sử dụng xuất khẩu.

export ABC="123"

Để kiểm tra xem nó đã được đặt chưa, hãy sử dụng

env

và / hoặc

env | grep ABC

Để thêm nó vĩnh viễn, thêm nó vào ~/.bashrctập tin của bạn .

export ABC="123"

6
Anh ta muốn biết nóng để định nghĩa nó vĩnh viễn , tức là, trong tập tin nào để đặt định nghĩa.
Matteo

1
Không hoạt động. Khi tôi đăng xuất, biến đã biến mất. Tôi cần nó qua các phiên

1
ý bạn là permenatekhông phải permenently: D
whoami

nhìn vào chỉnh sửa chobashrc
whoami

5
whats permenate? ý bạn là permanentsao
SSH này

3

Lệnh chính xác là:

echo 'export ABC = "123"' >> ~/.profile

4
Chính xác? Nghiêm túc? Vỏ nào (a) đọc ~/.profilevà (b) cho phép không gian trước và sau =?
G-Man

1

Cách tốt nhất phù hợp với tôi là sửa đổi tệp .bashrc trong trình bao BASH.

sử dụng ví dụ này:

  1. mở tệp .bashrc của bạn
  2. thêm dòng này:

    export <VARIABLE> = "<ANY PATH/VALUE you want>"
    

    ví dụ : export HOME = "/home/user/"

    Hãy nhớ sử dụng ""vì sử dụng ' 'sẽ không hoạt động và tệp bashrc của bạn sẽ báo lỗi trong khi tìm nguồn cung ứng.

  3. nguồn nó trong phiên hiện tại.

Tôi cũng đã cố gắng sửa đổi tệp / etc / môi trường nhưng nó không cho phép tôi tạo một biến môi trường mới và khi tôi lấy nó, nó đã báo lỗi rằng không tìm thấy biến được xác định.

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.