$ {PATH: +: $ {PATH}} nghĩa là gì?


24

Gần đây tôi đã nhận thấy những điều sau đây trong hồ sơ cygwin của tôi, chính xác hơn:

/usr/local/bin:/usr/bin${PATH:+:${PATH}}

Nó có nghĩa là gì? Tại sao không chỉ là $ PATH? Đây có phải là 'nếu $ PATH tồn tại thì thêm: $ PATH'? Mục đích của tôi là trao đổi thứ tự và đặt các đường dẫn cygwin phía sau đường dẫn windows. Trong quá khứ tôi sẽ có

$PATH:/usr/local/bin:/usr/bin

nhưng điều này làm tôi bối rối Có lẽ tôi nên làm

PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"

để nối thêm: vào cuối $ PATH?


1
Tiêu đề câu hỏi của bạn thực sự bị rối với định dạng trong thanh bên Câu hỏi nóng SE i.imgur.com/g6pPmzf.png
Brad

Câu trả lời:


38

Đây :+là một hình thức mở rộng tham số :

$ {tham số: + [word]} : Sử dụng giá trị thay thế.

Nếu tham số không được đặt hoặc null, null sẽ được thay thế; mặt khác, việc mở rộng từ (hoặc một chuỗi trống nếu từ bị bỏ qua) sẽ được thay thế.

Nói cách khác, nếu biến $varđược định nghĩa, echo ${var:+foo}sẽ in foovà nếu không, nó sẽ in chuỗi rỗng.

Thứ hai :là không có gì đặc biệt. Nó là ký tự được sử dụng như một dấu phân cách trong danh sách các thư mục trong $PATH. Vì vậy, PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"là một cách viết tốc ký:

if [ -z "$PATH" ]; then
    PATH=/usr/local/bin:/usr/bin
else
    PATH=/usr/local/bin:/usr/bin:$PATH
fi

Đó chỉ là một mẹo thông minh để tránh thêm phần bổ sung :khi $PATHkhông được đặt. Ví dụ:

$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin

Nhưng nếu PATHkhông được đặt:

$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:

A :tự thêm thư mục hiện tại vào $PATH. Sử dụng PATH="/new/dir${PATH:+:$PATH}"để tránh điều này. Vì vậy, chắc chắn, bạn có thể sử dụng PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"nếu bạn muốn, hoặc bạn có thể sử dụng PATH="$PATH:/usr/local/bin:/usr/bin"nếu bạn thích. Sự khác biệt duy nhất là cái trước có thể thêm một phần bổ sung :, do đó thêm thư mục hiện tại của bạn vào $PATH.


:có hại thêm ?
mèo

4
@tac không thực sự, nó chỉ thêm thư mục hiện tại vào câu trả lời của bạn $PATH(xem câu trả lời của @ AndyB ). Đó có thể là một rủi ro bảo mật trong một số trường hợp (giả sử kẻ tấn công đã tải lên một tập lệnh phá hoại vào thư mục hiện tại của bạn và đặt tên cho nó lshoặc một cái gì đó) nhưng trong hầu hết các trường hợp, bạn thực sự không bận tâm. Trong thực tế, một số hệ thống thêm thư mục hiện tại vào PATHmặc định.
terdon

con đường là một nơi mà tôi muốn họ cách cshxử lý sau đó nó như một mảng.
quê hương

8

Bạn nói đúng, điều đó có nghĩa là 'nếu $ PATH tồn tại - và không phải là null - thì hãy thêm: $ PATH'.

Bạn cần kiểm tra xem $ PATH có tồn tại không vì bạn không muốn thêm dấu hai chấm hàng đầu (hoặc dấu) nếu $ PATH không được xác định. Tên thư mục có độ dài bằng không (null) trong đường dẫn, như trong :/usr/local/bin:/usr/bin, hoặc /usr/local/bin:/usr/bin:, hoặc /usr/local/bin::/usr/bin, có nghĩa là tìm kiếm thư mục hiện tại .

Trích từ man bash:

   PATH   ...
          A zero-length (null) directory name in the value of PATH indicates 
          the current directory.  A  null  directory name may appear as two 
          adjacent colons, or as an initial or trailing colon.
          ...

Đó có lẽ không phải là những gì bạn muốn làm.

Hai dòng sau đây làm điều tương tự:

PATH=":/bin"        # search current directory, then /bin
PATH=".:/bin"
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.