Điểm:2

Sự khác biệt giữa "echo" và "xuất" một biến môi trường?

lá cờ sa

Môi trường là Ubuntu 18.

Nếu tôi thêm một dòng Java_HOME="/usr/java11" trong/etc/môi trường và thực thi nguồn/etc/môi trường , tôi có thể lặp lại biến môi trường này:

tiếng vang $Java_HOME
/usr/java11

Nhưng nếu tôi cố lấy nó từ xuất, thì biến này không có trong danh sách:

xuất | grep Java_HOME
--kết quả trống--

Sau đó, tôi sử dụng xuất $Java_HOME=/usr/java8 để xuất một biến (chú ý ở đây là java8, không phải java 11), tôi có thể có:

xuất |grep Java_HOME
khai báo -x Java_HOME="/usr/java8"

Bây giờ, tôi vẫn có thể tiếng vang $Java_HOME như /usr/java11:

tiếng vang $Java_HOME
/usr/java11

Câu hỏi: sự khác biệt của tiếng vang $ biếnxuất | grep Java_HOME?

Tôi thử một chương trình python đơn giản, os.environ.get("Java_HOME") trả về "/ usr/java8" từ quá trình xuất, không phải tiếng vang.

guiverc avatar
lá cờ cn
Bạn đề cập đến Ubuntu 18, vậy đây có phải là môi trường *chứa* Ubuntu Core 18 hay *snap* không? vì các mô hình *giam cầm* đang chơi trong 18 bản phát hành khác với các mô hình 18.04 mở hơn - vui lòng nêu cụ thể.
lá cờ hr
Tôi nghĩ vấn đề ở đây là `/etc/environment` chỉ là một danh sách các cặp tên=giá trị. Khi nó được `pam_env` đọc, các biến đó được xuất ra môi trường, nhưng việc tìm nguồn nó vào trình bao hiện tại của bạn chỉ tạo ra các biến trình bao thông thường - ví dụ: hãy kiểm tra với `declare -p JAVA_HOME`.
Ben L avatar
lá cờ sa
@steeldriver, "biến shell thông thường" là gì và các biến khác là gì?
Ben L avatar
lá cờ sa
@guiverc xin lỗi, tôi không biết 'chứa' là gì và 'chụp nhanh' là gì. Nó là một bộ chứa docker được tạo từ 'FROM ubuntu:18.04'
guiverc avatar
lá cờ cn
Ubuntu 18.04 là một sản phẩm khác với 18 sản phẩm; Các bản phát hành dựa trên *deb* bình thường của Ubuntu (không có ngăn chặn) sử dụng định dạng *year.month*; khác với các sản phẩm dựa trên 18 hoặc *năm* sử dụng ngăn chặn.Ubuntu đã có các sản phẩm dựa trên *năm* kể từ năm 2016 - bạn nên nói chính xác vì 18 & 18.04 đại diện cho các sản phẩm khác nhau (bản phát hành 18 không thể sử dụng gói *deb* - đó chỉ là *snap*) ; nhưng nếu bạn quen thuộc với các thùng chứa, bạn ~ biết điều này; nó ~ giống nhau với các thuật ngữ khác nhau ..
vanadium avatar
lá cờ cn
Điều này có trả lời câu hỏi của bạn không? [Sự khác biệt giữa set, export và env là gì và khi nào tôi nên sử dụng từng loại?](https://askubuntu.com/questions/205688/whats-the-difference-between-set-export-and-env-and-when -nên-tôi-dùng-mỗi)
Điểm:12
lá cờ hr

Vấn đề ở đây không thực sự là sự khác biệt giữa tiếng vangxuất khẩu, mà đúng hơn là sự khác biệt giữa một biến môi trường và đơn giản biến vỏ (và cả về cách /etc/môi trường tập tin thường được sử dụng).

Đặc biệt, mặc dù /etc/môi trường xảy ra để chứa các dòng của mẫu tên=giá trị hợp lệ dưới dạng các phép gán biến hệ vỏ POSIX, mục đích chính của nó (trong hệ thống Linux hiện đại) là để đọc bởi pam_env mô-đun trong quá trình khởi tạo phiên của người dùng - đó là pam_env xuất chúng sang môi trường của người dùng.

Khi bạn nguồn /etc/môi trường vào trình bao của bạn, không có phép thuật đặc biệt nào cho trình bao biết rằng các phép gán là của các biến môi trường (được xuất sang môi trường và do đó được kế thừa bởi các quy trình con) thay vì các biến trình bao thông thường (chỉ có sẵn trong trình bao hiện tại phạm vi).

Lần tới khi bạn đăng nhập, pam_env sẽ làm phép thuật của nó và Java_HOME sẽ sau đó xuất hiện trong đầu ra của xuất | grep Java_HOME.

Xem thêm

Ben L avatar
lá cờ sa
Nhờ chỉ ra sự khác biệt giữa "biến vỏ" và "biến môi trường".
vanadium avatar
lá cờ cn
"biến môi trường" về mặt kỹ thuật cũng là "biến vỏ". Họ là một tập hợp con.
Điểm:5
lá cờ cn

tiếng vangxuất khẩu là những lệnh rất khác nhau ngay từ đầu.

  • tiếng vang sẽ hiển thị văn bản. Trong tiếng vang $Java_HOME, trình bao sẽ thay thế $Java_HOME bằng nội dung của biến trình bao Java_HOME mà nó được xác định. Nếu không thì, $JAVA_HOME sẽ trả về một chuỗi rỗng.
  • xuất khẩu cung cấp thuộc tính "xuất khẩu" cho biến hệ vỏ. xuất Java_HOME sẽ đặt thuộc tính xuất, nghĩa là biến cũng sẽ có sẵn trong môi trường của bất kỳ trình bao phụ hoặc quy trình phụ nào thay vì chỉ trong trình bao hiện tại của bạn. Nếu biến chưa được đặt, bạn có thể xác định nó trong khi xuất như trong xuất Java_HOME=/usr/java11.

Trong /etc/môi trường, các biến môi trường được đăng ký với cú pháp gán biến. Nội dung của /etc/môi trường trong cài đặt Ubuntu mặc định thực sự có thể được thực thi.Vì vậy, nếu bạn thực hiện dòng bạn đã bao gồm:

`JAVA_HOME=/usr/java11`

Sau đó, tất cả những gì sẽ làm là gán giá trị hiện tại cho biến hệ vỏ PATH.

Tuy nhiên, vì bạn đã bao gồm biến trong /etc/môi trường, nó sẽ được xuất một cách hiệu quả trong lần khởi động tiếp theo của hệ thống của bạn. Sau đó, nó sẽ tồn tại trong xuất khẩu và xuất hiện trong tiếng vang $Java_HOME trong thiết bị đầu cuối đầu tiên bạn mở. Vì vậy, những gì bạn hiện đang quan sát là do bạn chưa khởi động lại máy sau khi sửa đổi /etc/môi trường (và không xuất biến theo cách khác).

Điểm:3
lá cờ in

Dựa trên các câu trả lời khác ở đây, một số lệnh song song xuất khẩu nhưng đối với các loại biến khác là bộ (hoạt động cho ví dụ: BIẾN=giá trị sau đó bộ | grep BIẾN) và env

Mỗi lệnh trong số ba lệnh này, khi không có đối số, sẽ in ra một danh sách các biến; những biến nào chúng sẽ in phải thực hiện với các loại biến mà lệnh quản lý.

Nhìn thấy Sự khác biệt giữa set, export và env là gì và khi nào tôi nên sử dụng từng loại?

tiếng vang $VARIABLE luôn hoạt động vì tất cả các loại biến có thể được đọc là $VARIABLE; tuy nhiên, điều này có nghĩa là nó không cung cấp cho bạn thông tin về loại biến hoặc nguồn gốc của nó.

Điểm:0
lá cờ us

tiếng vang là một lệnh để in văn bản và các biến thành thiết bị xuất chuẩn (hoặc chuyển hướng).

xuất khẩu liệt kê các biến được xuất hiện tại trong trình bao.

Chủ đề này giải thích lý do tại sao bạn sẽ sử dụng xuất khẩu tốt hơn nhiều so với tôi có thể:

https://stackoverflow.com/questions/7411455/what-does-export-do-in-shell-programming ... giải thích xuất khẩu là gì

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.