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_HOME
bị 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 export
phả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=foo
và export 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=foo
tương đương với export myvar=foo
nếu bạn chạy set -a
trong 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=value
cú pháp đơn giản và export
tiện ích.
Có một sự khác biệt giữa cú pháp gán và export
cú pháp. Shell mở rộng kết quả của các thay thế thay đổi $foo
hơn nữa, thực hiện tách trường (từ) và mở rộng tên đường dẫn (globalbing) . Điều này có nghĩa là nếu giá trị của myvar
is hello *
, sau đó echo $myvar
in hello
theo 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=$myvar
trê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.