Làm cách nào để thêm biến môi trường?


364

Tôi đang chạy Ubuntu 11.04. Tôi sử dụng thiết bị đầu cuối để bắt đầu một phiên bash và tôi muốn thêm một biến môi trường:

$r@hajt:~$ env THEVAR=/example

Nhưng nó không hoạt động. Nó hiển thị tất cả các biến với THEVAR là biến cuối cùng, nhưng một lệnh gọi khác envkhông hiển thị THEVARnữa - env | grep THEVARkhông trả về gì cả.

Tương tự, các tập lệnh có export ( export THEVAR=/example) hoặc các phép gán biến khác ( THEVAR=/example) không thêm biến môi trường.

Tôi biết tôi đang làm gì đó sai, tôi biết nó nên đơn giản, nhưng tôi không thể tìm thấy cái gì.

UPDATE: Ý nghĩa thực sự của câu hỏi của tôi là thế này: https://stackoverflow.com/questions/496702/can-a-shell-script-set-environment-variables-of-the-calling-shell

(Dù sao tôi cũng sẽ chọn câu trả lời được bình chọn nhiều nhất và để lại tiêu đề được chỉnh sửa - đó không phải là điều tôi đang hỏi)

env chạy một chương trình trong một môi trường sửa đổi, sau đó loại bỏ tất cả các thay đổi.


1
Khi được xác định / xuất trong .bashrc, nó hoạt động đúng.
huff


1
Thế còn THEVAR=/example?
Oleh Prypin

2
Cái khác là về các biến toàn cục, cái này không thêm giới hạn như vậy. Tôi sẽ giữ nó riêng biệt.
Lekensteyn

Câu trả lời:


570

Để thiết lập biến chỉ cho vỏ hiện tại:

VARNAME="my value"

Để đặt nó cho shell hiện tại và tất cả các quy trình bắt đầu từ shell hiện tại:

export VARNAME="my value"      # shorter, less portable version

Để đặt nó vĩnh viễn cho tất cả các phiên bash trong tương lai, hãy thêm dòng đó vào .bashrctệp của bạn trong $HOMEthư mục của bạn .

Để đặt nó vĩnh viễn và toàn hệ thống (tất cả người dùng, tất cả các quy trình), hãy thêm biến đặt trong / etc / môi trường:

sudo -H gedit /etc/environment

Tập tin này chỉ chấp nhận các bài tập biến như:

VARNAME="my value"

Không sử dụng exporttừ khóa ở đây.

Bạn cần đăng xuất khỏi người dùng hiện tại và đăng nhập lại để thay đổi biến môi trường diễn ra.


29
Shell config files such as ~/.bashrc, ~/.bash_profile, and ~/.bash_login are often suggested for setting environment variables. While this may work on Bash shells for programs started from the shell, variables set in those files are not available by default to programs started from the graphical environment in a desktop session. help.ubuntu.com/community/EnvironmentVariables
SudoSURoot

1
@ Mr.Hyde vâng, đó có lẽ là một nơi hợp lý
Michał rajer 7/12/2015

1
@BharadwajRaju vì trên một số hệ thống UNIX cũ, người ta chỉ có thể xuất biến đã được đặt. Solaris cũ và HP-UX chẳng hạn.
Michał Šrajer 18/03/2016

1
Khi bạn đặt biến môi trường, làm thế nào tôi có thể nhanh chóng xem nó để đảm bảo nó được đặt?
Rod

1
@Rodecho $myvar
Qwerty

29

Để đặt biến môi trường một lần, hãy sử dụng exportlệnh trong lời nhắc, không phải trong tập lệnh shell:

$ export THEVAR=/example

Biến sẽ được đặt cho phần còn lại của phiên shell hoặc cho đến khi không được đặt.

Để đặt biến môi trường mọi lúc, hãy sử dụng exportlệnh trong .bashrctệp (hoặc tệp khởi tạo thích hợp cho trình bao của bạn).

Để đặt biến môi trường từ tập lệnh, hãy sử dụng exportlệnh trong tập lệnh và sau đó sourcelà tập lệnh. Nếu bạn thực thi kịch bản, nó sẽ không hoạt động.

Để biết giải thích về sự khác biệt giữa tìm nguồn cung ứng và thực thi, hãy xem câu trả lời này: https://superuser.com/questions/176783/what-is-the-difference-b between-executing-a-bash-script-and-source- a- bash-script / 176788 # 176788


4
Làm thế nào tôi có thể làm cho nó hoạt động chỉ bằng cách thực hiện các kịch bản? Không có nguồn cung ứng.
Mithril

19

Để thêm vĩnh viễn một biến môi trường mới trong Ubuntu (chỉ được thử nghiệm trong 14.04), hãy sử dụng các bước sau:

  1. Mở một thiết bị đầu cuối (bằng cách nhấn CtrlAltT)
  2. sudo -H gedit /etc/environment
  3. Nhập mật khẩu của bạn
  4. Chỉnh sửa tệp văn bản vừa mở:
    ví dụ: nếu bạn muốn thêm FOO=bar, sau đó chỉ cần viết FOO=barvào một dòng mới
  5. Lưu nó
  6. Sau khi lưu, đăng xuất và đăng nhập lại.
  7. Những thay đổi cần thiết của bạn được thực hiện.

5
Tôi đã dọn sạch câu trả lời của bạn để loại bỏ các bit nguy hiểm hơn về sudo gedit(Xem Askubfox.com/questions/270006/ mẹo ) và chmod 777. Cái sau không bao giờ nên được thực hiện trên một tập tin cấu hình hệ thống.
muru

Đây là một câu trả lời đúng cho một số trường hợp nhất định. Tất cả các phiên, cho dù phiên shell của người dùng hay không sẽ nhận được giá trị của các biến được đặt ở đây. Điều quan trọng cần lưu ý là mặc dù điều này có thể trông giống như một tập lệnh shell, nhưng thực tế không phải vậy - nó chỉ cho phép bạn đặt các biến môi trường (so với sử dụng các hàm shell như ifhoặc test)
Tom Harrison Jr

Nếu thanh là một chuỗi, tôi có nên đặt nó giữa các dấu ngoặc kép? Thích Foo="bar"?
blue_chip

@blue_chip Không, hoạt động mà không có dấu ngoặc kép.
Nhấp vào Upvote

4
@blue_chip cho các biến môi trường, mọi thứ đều là một chuỗi. Bạn chỉ cần dấu ngoặc kép khi nó chứa khoảng trắng.
Ruslan

8

Để duy trì các thay đổi môi trường / var sau khi tập lệnh hoàn thành, bạn phải sử dụng source ./script.shhoặc ký hiệu viết tắt cho nguồn, ".", Như. ./script.sh

Nguồn sẽ thực thi các lệnh trong tập lệnh như thể bạn đã nhập chúng vào ... vì vậy, nó sẽ thay đổi một số khía cạnh của tập lệnh, chẳng hạn như thoát ... vì vậy, nếu tập lệnh của bạn kiểm tra một cái gì đó và quyết định thoát nếu sai, chẳng hạn, thông qua cuộc gọi exit 0, nó sẽ chấm dứt phiên thiết bị đầu cuối / shell hiện tại của bạn.


Đây là một câu hỏi rất cũ mà đã có một câu trả lời chấp nhận và một vài người khác ... Hãy xem xét, trả lời nhiều câu hỏi gần đây xin vui lòng ...
NerdOfCode

3
@NerdOfCode câu trả lời này giải quyết một vấn đề vẫn còn liên quan và không có câu trả lời nào khác, kể cả câu trả lời được chấp nhận, đề cập đến, theo như tôi có thể thấy ... Thực tế có hai huy hiệu có sẵn để cung cấp câu trả lời tốt cho câu hỏi cũ, vì vậy điều này được khuyến khích
Zanna

1
Đây chính xác là những gì tôi đang tìm kiếm. Tôi cần phải xem ra kịch bản, các biến được xuất từ ​​tập lệnh.
albanx

5

Nếu bạn đang thực hiện mọi thứ thông qua tập lệnh, một cách dễ dàng để đặt biến môi trường vĩnh viễn được đặt bên dưới câu lệnh trong tập lệnh của bạn,

if [[ ! -d "$MyVar" ]]; then 
    export MyVar="abc"
    echo 'export MyVar="abc"' >> ~/.bashrc
fi

Nếu bạn cần đánh giá các biểu thức như pwd, bạn có thể sử dụng ví dụ này

echo "export EIGEN_ROOT=\"$(pwd)/eigen\"" >> ~/.bashrc

1

Tôi biết là khá muộn, nhưng nếu bạn muốn thêm một biến môi trường cho tất cả người dùng (ví dụ: sử dụng JAVA) - bạn có thể làm như sau:

1) Mở /etc/bash.bashrcbằng nano (bạn có thể sử dụng bất kỳ trình chỉnh sửa nào, tôi không thích VIM vì nó tệ nhất khi nói đến sự thân thiện với người dùng - không có gì cá nhân).

2) Nối vào tệp:

export VAR=path export PATH=$PATH:/bin 3) (Tốt hơn nếu bạn có thể trả lại hộp) - hoặc chỉ cần mở một phiên SSH mới và xác nhận bằng cách sử dụng lệnh 'env'.

NHƯNG NẾU bạn muốn mỗi người dùng có một cài đặt riêng cho việc này, bạn phải thực hiện thay đổi (theo kịch bản) để .bashrcgửi theo ~/.bashrc(hoặc /home/$USER/nếu bạn chưa quen với các hệ thống Linux)

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.