Lệnh thoát với trạng thái 0 (không / bin / true)?


11

Tôi đã có một Makefile chạy một công cụ mất một chút thời gian; nó cho phép tôi thay thế lệnh được sử dụng:

make TOOL=alternative-tool

Tôi muốn bỏ qua bước đó trong Makefile, vì vậy tôi đang tìm kiếm một lệnh thoát với trạng thái 0 và có tác dụng phụ không đáng kể.

Rõ ràng, tôi chỉ có thể sử dụng true, nhưng điều đó hơi khó hiểu:

make TOOL=true

Nó đọc như thể tôi muốn chạy công cụ, nhưng tôi thì không.

Có một thực thi được cài đặt mặc định không tồn tại /bin/truevới trạng thái 0 và có một tên dễ hiểu và dễ gõ không?


Makefiles hỗ trợ bình luận, gnu.org/software/make/manual/html_node/Makefile-Contents.html . Đặt một bình luận trước dòng và tài liệu mã của bạn. Điều đó làm giảm sự nhầm lẫn và giải thích lý do tại sao bạn sử dụng một phương pháp nhất định.
Freiheit

1
Dòng gì? Các TOOL=truesẽ được trên dòng lệnh khi gọi thực hiện, có thể ghi nhận ở một README gần đó. Dòng thực tế gọi công cụ này nằm ở đâu đó trong tệp thực hiện 7000 dòng (bên thứ ba).
Roger Lipscombe

Câu trả lời:


42

Mặc dù bạn đã yêu cầu một cái gì đó là "không /bin/true", thay thế truebằng tên đầy đủ /bin/trueđể cho thấy rằng đó là truechương trình chứ không phải là một số ý nghĩa khác của "đúng" có lẽ là giải pháp tốt nhất.

Mối quan tâm của bạn là truetrong

make TOOL=true

dường như là một cái gì đó khác với một tên lệnh. Nhưng nếu bạn viết

make TOOL=/bin/true

sau đó rõ ràng là một lệnh. Ai đó có thể đọc sai TOOL=truecó nghĩa là một số công cụ khác ở đâu đó được dự định, nhưng không có TOOL=/bin/truekhả năng đọc sai như vậy .


Tôi không chắc chắn khi nào :, đó là một shell dựng sẵn nhưng không phải là một lệnh bên ngoài, sẽ hoạt động. Henning Makholm đã báo cáo rằng nó dường như hoạt động . Nhưng tôi nghĩ rằng nó không hoạt động trong mọi tình huống và bạn thấy rằng nó không hoạt động với bạn .

Đối với bí danh shell, bạn không thể sử dụng điều đó bởi vì việc mở rộng bí danh không được thực hiện trong các đối số bạn truyền cho một lệnh, cũng như các makefile không sử dụng các bí danh shell được xác định trước đó. Ngay cả khi makechạy các lệnh của bạn trong một shell mới, shell đó sẽ không có bí danh (và sẽ không sử dụng nó ngay cả khi nó có nó, bởi vì nó sẽ là một shell không tương tác, khi mở rộng bí danh không được kích hoạt tự động).


1
Sử dụng :dường như làm việc tốt cho tôi. makeluôn luôn tạo ra một shell để chạy từng lệnh sau khi nó thực hiện các thay thế riêng.
hmakholm còn lại của Monica

@HenningMakholm Cảm ơn, tôi đã chỉnh sửa. Bạn có thể muốn gửi một câu trả lời. Lok Lam Cheng đã bình luận về câu hỏi để đề xuất :, nhưng nó nên là một câu trả lời (đặc biệt là nếu đúng) và nhận xét đó không giải thích lý do tại sao người ta nên mong đợi nó hoạt động. Trong một thư mục có hello.cvà không có tệp thực hiện, nơi make hellobiên dịch hello.ctới hello, tôi thấy make CC=: hellohành vi theo những gì bạn đang nói.
Eliah Kagan

2
Thật không may, đối với Makefile cụ thể này (nó sử dụng erlang.mk ), sử dụng :không hoạt động. Rõ ràng về /bin/truecó lẽ là cách tốt nhất để làm điều đó.
Roger Lipscombe

7

Mặc dù tôi đồng ý rằng sử dụng đường dẫn đầy đủ truesẽ là giải pháp tốt nhất, tôi muốn lưu ý những gì có lẽ là cách phổ biến nhất để tránh thực thi lệnh thực sự: dán echophía trước nó. Vì thế:

make TOOL=echo

Tôi nghĩ rằng điều này đôi khi hữu ích khi một điều quan trọng cần được nhắc nhở rằng người ta sẽ kìm nén bất cứ hành động nào TOOLsẽ làm. Không có -shoặc tương đương, makephát ra thông tin dư thừa, bởi vì cả hai makeecholệnh được chạy bằng makecách phát ra đầu ra riêng biệt. Ví dụ, khi tôi chạy make CC=echo hellotrong một thư mục có hello.cvà không có tệp thực hiện, tôi nhận được echo hello.c -o hellolà dòng đầu ra đầu tiên và hello.c -o hellolà dòng thứ hai. Nhưng một số bản dựng sử dụng (hoặc người dùng có thể thêm) -s, và sau đó nó hữu ích. make -s CC=echo hellochỉ cho hello.c -o hello.
Eliah Kagan

(có thể vẫn hữu ích nếu các lệnh liên quan đến mở rộng shell, vì vậy bạn có thể hiểu rõ hơn về những gì đang được chạy, nếu quan tâm)
muru

5

Bạn luôn có thể thực hiện lệnh của riêng bạn mà không làm gì ngoài trả về trạng thái thoát không. Một số tùy chọn:

  • một liên kết tượng trưng được đặt tên thích hợp để /bin/true

  • một kịch bản shell rỗng

  • một chương trình C gần như trống rỗng:

    int main() {
        return 0;
    }

Một cái tên hay cho một chương trình như vậy sẽ là noop hoặc no-op.
arp

0

Tạo một liên kết tượng trưng trong thư mục làm việc tới / bin / true được đặt tên giống như skip. Do đó ...

skip -> /bin/true

Sau đó, dòng sản phẩm có thể là ...

make TOOL=./skip

-2

Đây là một cách để làm điều đó với nhiều ký tự hơn một chút:

function T() { /bin/true; }

Sau khi bạn thực hiện xong, bạn có thể thực hiện lại chỉ bằng cách sử dụng tên T.

false; T; echo $?

3
Bạn có thể giải thích làm thế nào chức năng này có thể được gọi từ một giá trị biến (sẽ được sử dụng trong tình huống được đề cập)?
David Foerster
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.