Khi nào nên sử dụng dấu chấm phẩy giữa các biến môi trường và lệnh


14

Bất cứ ai có thể giải thích tại sao dấu chấm phẩy là cần thiết LANGđể được xem như được cập nhật bởi bash?

Không hoạt động:

> LANG=Ja_JP bash -c "echo $LANG"
en_US

Làm:

> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP

Tôi đang làm việc với cả bash 4.1.10 trên linux và cùng một phiên bản dưới cygwin

Câu trả lời:


23

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_UStrước khi mọi thứ được thực thi. Sau khi bashxử lý xong đầu vào, nó tạo ra một quy trình, thêm LANG=Ja_JPvà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-8khi 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.


Câu trả lời tuyệt vời - cảm ơn! Về việc bổ sung UTF-8. Tôi đang cố gắng kiểm tra xử lý cục bộ của một ứng dụng cần hoạt động trên một số nền tảng một số nền tảng khá cũ. Giữa những khác biệt như thế này (rất may là bạn đã giải thích) và sự khác biệt trên linux và cygwin Tôi sắp ném mình xuống xe buýt!
Richard Corden

5

VAR=value; somecommand tương đương với

VAR=value
somecommand

Đây là các lệnh không liên quan được thực thi lần lượt. Lệnh đầu tiên gán một giá trị cho biến shell VAR. Trừ khi VARđã là một biến môi trường, nó không được xuất ra môi trường, nó vẫn còn bên trong vỏ. Một tuyên bố export VARsẽ xuất khẩu VARra môi trường.

VAR=value somecommandlà một cú pháp khác nhau. Việc gán VAR=valuelà cho môi trường, nhưng việc gán này chỉ được thực hiện trong môi trường thực thi somecommandchứ không phải cho lần thực hiện tiếp theo của shell.

Bằng cách lấy ví dụ:

# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1                        # displays "value"
env | grep '^VAR1='               # displays nothing
VAR2=value env | grep '^VAR2='    # displays "VAR2=value"
echo $VAR2                        # displays nothing

Tôi đã không thực sự nghĩ về sự khác biệt giữa biến vỏ và biến môi trường. Tôi sẽ phải đi làm một số nghiên cứu. Cảm ơn câu trả lời.
Richard Corden
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.