Khi bạn sử dụng LANG=C gcc ...
những gì xảy ra là vỏ đặt LANG cho gcc
's môi trường chỉ , và không cho hiện tại môi trường tự ( xem chú thích ). Vì vậy, sau khi gcc
kết thúc, LANG
trở lại giá trị trước đó của nó (hoặc bỏ đặt).
Ngoài ra, khi bạn sử dụng, A=10 echo $A
nó là lớp vỏ thay thế $ A, không phải tiếng vang và sự thay thế này (được gọi là "mở rộng") xảy ra trước khi câu lệnh được ước tính (bao gồm cả phép gán), do đó, phải hoạt động như A
giá trị mong đợi trong môi trường hiện tại trước tuyên bố đó.
Đó là lý do tại sao A=10 echo $A
không hoạt động như mong đợi: A=10
sẽ được đặt cho tiếng vang, nhưng tiếng vang bên trong bỏ qua giá trị của biến môi trường A
. Và $A
được thay thế bằng giá trị được đặt trong trình bao hiện tại (không có giá trị nào), và sau đó được chuyển làm đối số cho tiếng vang.
Vì vậy, giả định của bạn là chính xác: VAR=value command
không hoạt động, nhưng điều này chỉ có liên quan nếu command
nội bộ sử dụng VAR. Nếu không, bạn vẫn có thể chuyển value
làm đối số cho command
, nhưng đối số được thay thế bằng trình bao hiện tại , do đó chúng phải được đặt trước khi sử dụng:VAR=value; command "$VAR"
Nếu bạn biết cách tạo một tập lệnh thực thi, bạn có thể thử điều này dưới dạng thử nghiệm:
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
Lưu nó dưới dạng testscript
và thử:
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
Cuối cùng nhưng không kém phần quan trọng, đáng để biết sự khác biệt giữa các biến shell và biến môi trường và các đối số chương trình .
Dưới đây là một số tài liệu tham khảo tốt:
.
(*) Lưu ý: về mặt kỹ thuật, shell cũng được đặt trong môi trường hiện tại và đây là lý do: Một số lệnh, như echo
, read
và test
là các nội dung shell , và do đó chúng không sinh ra một tiến trình con. Họ chạy trong môi trường hiện tại. Nhưng shell chăm sóc cho nhiệm vụ chỉ tồn tại cho đến khi lệnh đang chạy, vì vậy đối với tất cả các mục đích thực tế, hiệu quả là như nhau: việc chuyển nhượng chỉ được nhìn thấy bởi lệnh đơn lẻ đó.
A=10 (echo $A)
và nhận được10
không?