: lệnh dấu hai chấm cho bash


28

Nói với tư cách là một người mới chơi bash, tôi đã nâng cấp .bashrc của mình thông qua copy / paste + github và tôi đã bắt gặp :lệnh bắt đầu cả tôi và google. ví dụ : ${USER_BASH_COMPLETION_DIR:=~/.bash_completion.d}.

Không có câu lệnh này ban đầu trong .bashrc của tôi và nhập nội dung này vào thiết bị đầu cuối của tôi ( -> cho biết đầu ra có liên quan):

: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
echo $USER_BASH_COMPLETION_DIR
-> /Users/sh/.bash_completion.d

Và:

: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
export USER_BASH_COMPLETION_DIR=asdf
echo $USER_BASH_COMPLETION_DIR
-> asdf

Nhưng:

: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
export USER_BASH_COMPLETION_DIR=asdf
: ${USER_BASH_COMPLETION_DIR=~/.bash_completion.d}
echo $USER_BASH_COMPLETION_DIR
-> asdf

Tôi không hiểu!

1) Làm thế nào để lệnh dấu hai chấm đặt một biến nhưng không thể ghi đè lên một tập hợp bởi export?

2) Logic đằng sau việc sử dụng :trong một số .bashrc là gì?

Sử dụng máy Mac 10.6.8

(ngoài ngữ cảnh bao gồm từ khóa đại tràng chỉ để giúp những người khác như tôi đã cố gắng tìm kiếm cụm từ đó)


Xem câu trả lời xuất sắc ở đó stackoverflow.com/questions/10390406/ Khăn
Cedric

Câu trả lời:


45

:là một shell dựng sẵn về cơ bản tương đương với truelệnh. Nó thường được sử dụng như là một no-op, ví dụ sau một iftuyên bố. Bạn có thể đọc thêm về nó trong câu hỏi này từ stack stack .

Các ${varname=value}cơ bản có nghĩa là thiết lập giá trị của $varnameđể valuenếu $varnamechưa được thiết lập, và sau đó trở về giá trị của $ varname. Mặc dù nếu bạn cố chạy nó ở dòng lệnh, nó sẽ cố chạy giá trị được trả về. Đặt :phía trước là một no-op ngăn bash cố gắng chạy giá trị.

Lưu ý có hai hình thức hơi khác nhau:

${varname:=value}

đặt varname thành giá trị nếu varname là unset hoặc null.

${varname=value}

chỉ đặt giá trị của varname nếu varname hiện không được đặt (nghĩa là nó sẽ không thay đổi varname từ "" thành value)

(Cảm ơn bạn để chepner đã làm rõ điều đó trong một bình luận).

Một số người khác tham khảo phương pháp này

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.