Tham số và các loại mở rộng khác được thực hiện khi lệnh được đọc, trước nó được thực thi.
Phiên bản đầu tiên LANG=Ja_JP bash -c "echo $LANG"
, là một lệnh duy nhất. Sau khi được phân tích cú pháp như vậy, $LANG
được mở rộng đến en_US
trước khi mọi thứ được thực thi. Sau khi bash
xử lý xong đầu vào, nó tạo ra một quy trình, thêm LANG=Ja_JP
vào môi trường như mong đợi và sau đó thực thi bash -c echo en_US
.
Bạn có thể ngăn chặn mở rộng với dấu ngoặc đơn, tức là LANG=Ja_JP bash -c 'echo $LANG'
đầu ra Ja_JP
.
Lưu ý rằng khi bạn có một phép gán biến là một phần của lệnh, thì phép gán chỉ ảnh hưởng đến môi trường của lệnh đó chứ không ảnh hưởng đến vỏ của bạn.
Phiên bản thứ hai, LANG=Ja_JP; bash -c "echo $LANG"
thực sự là hai lệnh riêng biệt được thực hiện theo trình tự. Đầu tiên là một phép gán biến đơn giản không có lệnh, vì vậy nó ảnh hưởng đến trình bao hiện tại của bạn.
Do đó, hai đoạn trích của bạn về cơ bản là khác nhau mặc dù sự khác biệt bề ngoài của một ;
.
Hoàn toàn lạc đề, nhưng tôi có thể khuyên bạn nên nối thêm .UTF-8
khi cài đặt LANG
. Ngày nay không có lý do chính đáng nào để không sử dụng Unicode trong thế kỷ 21.