Ý nghĩa của $ {GZIP_BINDIR - '/ bin'} trong bash là gì?


13

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:


19

${GZIP_BINDIR-'/bin'}là một bashmô 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_BINDIRcó 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 /binsẽ đượ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ó $PATHsẽ được mở rộng đến các giá trị mà nó đã giữ trước đó. Vì vậy, nếu PATHtrước đây có:

/usr/sbin:/usr/bin

Bây giờ bạn PATHsẽ (xem xét GZIP_BINDIRkhông được thiết lập):

/bin:/usr/sbin:/usr/bin

export PATHsẽ làm cho điều này PATHcó sẵn cho tất cả các quá trình con.


" Tôi nghĩ rằng bạn đã bỏ lỡ một :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.
nyuszika7h

@ nyuszika7h Yeah..tôi không biết điều đó trước đây..theo sao tại sao nó không được đưa vào trang web ..
heemayl

Trong trang bash trên máy tính của tôi, đoạn ngay phía trên phần trên có nội dung :-: "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. "
jwodder 27/05/2015

Là một lưu ý phụ, bạn có thể kết hợp cài đặt PATHexportthành một lệnh như sau:export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
Paddy Landau

8

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 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


2

Lệnh này cập nhật biến PATH.

Đây PATHlà 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_BINDIRnế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

GZIP_BINDIR là biến
Maythux 27/05/2015

Điều gì không đúng? Không, tôi không có? Của tôi cũng bị hạ cấp
Maythux 27/05/2015

Tại sao lại hạ thấp?!
Maythux 27/05/2015
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.