Tầm quan trọng của dấu ngoặc đơn và dấu ngoặc kép trong các biến môi trường là gì?


19

Tôi đã xác định một số biến môi trường trong .profile của mình như thế này:

MY_HOME="/home/my_user"

nhưng biến dường như không đánh giá được trừ khi tôi loại bỏ dấu ngoặc kép và lấy lại nguồn tệp. Tôi tin rằng các trích dẫn là cần thiết nếu sẽ có khoảng trắng, và các trích dẫn đơn được sử dụng nếu không muốn thoát. Ai đó có thể làm rõ tầm quan trọng của dấu ngoặc đơn và dấu ngoặc kép trong định nghĩa biến? Làm thế nào về tick-tick và back-tick?

Câu trả lời:


23

Tôi nghĩ rằng bạn đang nhầm lẫn về thuật ngữ.

Một "biến môi trường" chỉ là một biến shell mà bất kỳ tiến trình con nào cũng sẽ kế thừa.

Những gì bạn đang làm trong ví dụ của bạn là tạo một biến shell. Nó không ở trong môi trường cho đến khi bạn xuất nó:

MY_HOME="/home/my_user"
export MY_HOME

đặt một biến có tên "MY_HOME" trong hầu hết các shell (trừ csh, tcsh).

Trong trường hợp cụ thể này, dấu ngoặc kép là thừa. Chúng không có tác dụng. Double-ngoặc kép nhóm, nhưng cho phép bất kỳ shell nào bạn sử dụng để thay thế biến. Nhóm trích dẫn đơn nhóm và ngăn thay thế. Vì bài tập ví dụ của bạn không có bất kỳ biến nào trong đó, nên dấu ngoặc kép có thể xuất hiện dưới dạng dấu ngoặc đơn.

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment

Không có gì trong môi trường cho đến khi bạn xuất nó.


18

Biến Shell so với biến môi trường

MY_HOME="/home/my_user"đặt biến shell được gọi là MY_HOME. Shell là ngôn ngữ lập trình và có các biến (còn được gọi là tham số). Sau khi gán này, bạn có thể sử dụng giá trị của biến, ví dụ với echo "$MY_HOME".

Biến Shell là một khái niệm shell nội bộ. Khi ví dụ shell đó chấm dứt, MY_HOMEbị lãng quên. Điều mà mọi chương trình đều biết và truyền cho con của nó là các biến môi trường .

Bên trong shell, các biến môi trường và biến shell hoạt động theo những cách rất giống nhau. Điều thực sự xảy ra là tất cả các biến môi trường mà shell kế thừa từ cha của nó trở thành các biến shell. Ngược lại, một biến shell được xác định trong tập lệnh shell sẽ trở thành biến môi trường nếu bạn xuất nó.

export MY_HOME="/home/my_user"

Thêm chi tiết bạn có thể bỏ qua trong lần đọc đầu tiên

Lý do tại sao các biến shell không tự động trở thành biến môi trường một phần là do tập lệnh có thể vô tình sử dụng tên biến có ý nghĩa đối với chương trình mà nó khởi chạy và một phần chỉ mang tính lịch sử.

Một số shell rất cũ bắt buộc exportphải được sử dụng mỗi khi bạn thay đổi tên biến, nhưng tất cả các shell hiện đại đều theo dõi các bài tập cho các biến môi trường, để đoạn trích sau lặp lại bar:

myvar=foo
export myvar
myvar=bar
env | grep '^myvar='

Ngoài ra, một số shell rất cũ yêu cầu các lệnh riêng biệt cho myvar=fooexport myvar, nhưng tất cả các shell hiện đại đều hiểu export myvar=foo.

Bạn có thể chạy set -ađể làm cho tất cả các phép gán biến shell tự động xuất biến, do đó, myvar=footương đương với export myvar=foonếu bạn chạy set -atrong shell đó trước.

Về trích dẫn

Trích dẫn chủ yếu là trực giao. Nếu giá trị bạn gán cho biến không chứa bất kỳ ký tự nào đặc biệt cho trình bao, bạn không cần bất kỳ dấu ngoặc kép nào. Nếu có các ký tự đặc biệt, bạn cần bảo vệ chúng bằng dấu ngoặc đơn hoặc dấu ngoặc kép hoặc dấu gạch chéo ngược hoặc kết hợp từ đó. Điều này đi cho cả myvar=valuecú pháp đơn giản và exporttiện ích.

Có một sự khác biệt giữa cú pháp gán và exportcú pháp. Shell mở rộng kết quả của các thay thế thay đổi $foohơn nữa, thực hiện tách trường (từ)mở rộng tên đường dẫn (globalbing) . Điều này có nghĩa là nếu giá trị của myvaris hello ​ *, sau đó echo $myvarin hellotheo sau là một khoảng trắng theo sau là danh sách các tệp trong thư mục hiện tại. Điều này gần như không bao giờ được mong muốn, do đó, nguyên tắc chung là luôn sử dụng dấu ngoặc kép xung quanh các thay thế khác nhau (trừ khi bạn biết rằng bạn cần mở rộng tên đường dẫn hoặc tách trường) : echo "$myvar". Trong trường hợp của một nhiệm vụ đơn giản, othervar=$myvartrên thực tế đáng tin cậy các bản sao giá trị của myvarđểothervar, bởi vì việc chia tách và tách từ bị ức chế trong các bài tập (vì chúng tạo ra nhiều từ, nhưng một từ duy nhất được mong đợi). Điều này không áp dụng cho export, tuy nhiên. Vì vậy, nếu bạn muốn nhớ một quy tắc đơn giản, chỉ cần luôn luôn sử dụng dấu ngoặc kép xung quanh các thay thế khác nhau.


Bạn có thể vui lòng giải thích "Trích dẫn chủ yếu là trực giao." trong phần "Trên trích dẫn"? Tôi không hiểu ý nghĩa trực giao trong câu đó.
Công lý cho Monica

1
@DKBose Điều đó có nghĩa là môi trường so với các biến shell một mặt và mặt khác, là hai vấn đề riêng biệt ít liên quan đến nhau. Wiktionary có nghĩa là 4 và 5.
Gilles 'SO- ngừng trở nên xấu xa'
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.