2011-12-22 56 views

Trả lời

120

Điều đó có nghĩa là "không lặp lại lệnh này trên đầu ra". Vì vậy, quy tắc này đang nói "thực thi lệnh shell : và không lặp lại đầu ra.

Tất nhiên lệnh shell : là không có, vì vậy điều này là" không làm gì cả và đừng nói ".

Tại sao?

Bí quyết ở đây là bạn đã có một sự kết hợp tối nghĩa của hai cú pháp khác nhau. các làm (1) cú pháp là việc sử dụng của một hành động bắt đầu với @, mà chỉ đơn giản là không được lặp lại lệnh. Vì vậy, quy tắc như

always: 
     @echo this always happens 

sẽ không phát ra

echo this always happens 
    this always happens 

Bây giờ, phần hành động của một quy tắc có thể bất kỳ lệnh vỏ, bao gồm :. Bash giúp giải thích này cũng như bất cứ nơi nào:

$ help : 
:: : 
    Null command. 

    No effect; the command does nothing. 

    Exit Status: 
    Always succeeds. 
+0

cảm ơn, là có một nơi nào đó mô tả này một cách chi tiết hơn? Tôi không chắc những gì "out-ut" là. – cdwilson

+9

Đừng làm cho việc đánh máy của tôi trở nên thú vị, bạn cũng sẽ già đi một ngày nào đó. –

+0

Cảm ơn, điều đó thực sự hữu ích! Cho đến khi tôi đọc câu trả lời của bạn, tôi đã nghĩ rằng '@:' là một số chủ nghĩa hài hước (tôi không nhận ra đó là sự kết hợp của hai thứ ...) – cdwilson

28

Đối với những người tò mò về lý do tại sao bạn có thể làm điều này, nó rất hữu ích nếu bạn muốn giả vờ như một cái gì đó đã được thực hiện, do đó hãy chắc rằng không đầu ra "Không có gì là thực hiện cho "mục tiêu của bạn.

Một ví dụ là nếu bạn có mục tiêu giả mạo mà bạn luôn thực thi và trong đó bạn có một loạt các điều kiện trong lệnh. Bạn muốn có ít nhất một cái gì đó trong trường hợp những điều kiện đi lên sai và không có gì được thực hiện.

Ví dụ (từ kịch bản của Linux/Makefile.clean):

__clean: $(subdir-ymn) 
ifneq ($(strip $(__clean-files)),) 
    +$(call cmd,clean) 
endif 
ifneq ($(strip $(__clean-dirs)),) 
    +$(call cmd,cleandir) 
endif 
ifneq ($(strip $(clean-rule)),) 
    +$(clean-rule) 
endif 
    @: 
+0

Ah ha, vậy là xong! –

Các vấn đề liên quan