Bất cứ ai có thể giải thích những gì lệnh này có nghĩa là?
PATH="${GZIP_BINDIR-'/bin'}:$PATH"; export PATH
Bất cứ ai có thể giải thích những gì lệnh này có nghĩa là?
PATH="${GZIP_BINDIR-'/bin'}:$PATH"; export PATH
Câu trả lời:
${GZIP_BINDIR-'/bin'}
là một bash
mô hình mở rộng tham số. Từ man bash
:
${parameter:-word}
Use Default Values. If parameter is unset or null,
the expansion of word is substituted. Otherwise, the value of parameter
is substituted.
Ngay trước phần này, trang man có (cảm ơn @jwodder đã thông báo):
Omitting the colon results in a test only for a parameter that is unset.
Như manpage nói, nó sẽ đặt giá trị mặc định của biến GZIP_BINDIR
. Nếu GZIP_BINDIR
có một giá trị được đặt trước đó (không phải là null khi bạn không sử dụng :
) thì giá trị đó sẽ được sử dụng, nếu không /bin
sẽ được sử dụng làm giá trị của biến GZIP_BINDIR
.
Mặt khác, nếu bạn cũng muốn kiểm tra các giá trị null, hãy sử dụng mẫu này (bao gồm :
):
${GZIP_BINDIR:-'/bin'}
Sau đó, nó $PATH
sẽ được mở rộng đến các giá trị mà nó đã giữ trước đó. Vì vậy, nếu PATH
trước đây có:
/usr/sbin:/usr/bin
Bây giờ bạn PATH
sẽ (xem xét GZIP_BINDIR
không được thiết lập):
/bin:/usr/sbin:/usr/bin
export PATH
sẽ làm cho điều này PATH
có sẵn cho tất cả các quá trình con.
:-
: "Khi không thực hiện mở rộng chuỗi con, hãy sử dụng các biểu mẫu được ghi lại dưới đây (ví dụ :-), bash kiểm tra tham số không được đặt hoặc null. Bỏ dấu hai chấm kết quả trong một thử nghiệm chỉ cho một tham số không được đặt. "
PATH
và export
thành một lệnh như sau:export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
Có thực sự không có dấu hai chấm trước dấu gạch nối bên trong mở rộng tham số ${GZIP_BINDIR-'/bin'}
?
Kiểu cấu trúc này hầu như luôn được viết bằng dấu hai chấm, như ${GZIP_BINDIR:-'/bin'}
có nghĩa là, "nếu $ GZIP_BINDIR là NULL hoặc không được đặt, hãy đặt nó thành '/ bin'"
Tuy nhiên, cú pháp bạn cung cấp là hợp lệ, nhưng hiếm. ${GZIP_BINDIR-'/bin'}
(không có dấu hai chấm) có nghĩa là "nếu $ GZIP_BINDIR không được đặt, hãy đặt nó thành '/ bin'". Nếu nó được đặt (đã được khai báo) nhưng không có gì được gán cho nó (ví dụ: NULL), sẽ không có gì được chèn vào.
Có thể có một lỗi ở đây mặc dù dấu hai chấm theo cấu trúc biến (...} :
$ PATH ...) sẽ vẫn được chèn nếu $ GZIP_BINDIR được đặt nhưng NULL. Vì điều này sẽ thêm dấu hai chấm vào đầu $ PATH, nó sẽ khiến thư mục hiện tại được tìm kiếm trước tiên.
Điều đó được coi là hầu hết là một vấn đề bảo mật vì nó dễ gây ra một chương trình độc hại có cùng tên với các lệnh tiêu chuẩn được chạy chỉ bằng cách đặt nó vào thư mục hiện tại.
Để giữ $ PATH không thay đổi nếu $ GZIP_BINDIR được đặt nhưng NULL (trống), cú pháp đúng sẽ là ${GZIP_BINDIR-'/bin:'}$PATH; export PATH
Để không thay đổi $ PATH nếu $ GZIP_BINDIR không được đặt hoặc được đặt nhưng NULL, cú pháp đúng sẽ là ${GZIP_BINDIR:-'/bin:'}$PATH; export PATH
Lệnh này cập nhật biến PATH.
Đây PATH
là một biến môi trường chỉ định một tập hợp các thư mục chứa các chương trình thực thi được đặt.
PATH="${GZIP_BINDIR-'/bin'}:$PATH";
Điều này thêm giá trị của một biến khác GZIP_BINDIR
nếu thoát ra khỏi PATH khác sử dụng / bin thay thế và thêm nó vào PATH
export PATH
xuất khẩu được sử dụng để đặt PATH có sẵn cho tất cả các quy trình con và các lớp con Đọc này để biết thêm thông tin về
Bạn phải lưu ý rằng đây không phải là tĩnh và bạn sẽ mất nó sau khi thoát khỏi vỏ.
Để chỉnh sửa PATH này vĩnh viễn, bạn phải nối các dòng này vào .bashrc
gedit .bashrc
và thêm dòng
export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
sau đó chạy lệnh
source .bashrc
:
trong${GZIP_BINDIR-'/bin'}
" Không nhất thiết.${parameter-word}
cũng hợp lệ, mặc dù dường như không có trong trang man.