Ưu tiên của các tùy chọn lệnh?


21

Tôi biết rằng rm -f file1sẽ mạnh mẽ loại bỏ file1mà không nhắc tôi.

Tôi cũng biết rằng rm -i file1trước tiên sẽ nhắc tôi trước khi xóafile1

Bây giờ nếu bạn thực thi rm -if file1, điều này cũng sẽ mạnh mẽ loại bỏ file1mà không nhắc tôi.

Tuy nhiên, nếu bạn thực thi rm -fi file1, nó sẽ nhắc tôi trước khi gỡ bỏ file1.

Vì vậy, có đúng là khi kết hợp các tùy chọn lệnh, cái cuối cùng sẽ được ưu tiên? như thế rm -if, sau đó -fsẽ được ưu tiên, nhưng rm -fithì -isẽ được ưu tiên.

Các lslệnh ví dụ, nó không quan trọng nếu bạn nói ls -latRhay ls -Rtal.

Vì vậy, tôi đoán nó chỉ quan trọng khi bạn có các tùy chọn lệnh mâu thuẫn như thế rm -if, điều đó có đúng không?


Câu trả lời:


23

Khi sử dụng rmvới cả hai -i-f tùy chọn, cái đầu tiên sẽ bị bỏ qua. Điều này được ghi lại trong tiêu chuẩn POSIX :

    -f
       Do not prompt for confirmation. Do not write diagnostic messages or modify
       the exit status in the case of nonexistent operands. Any previous
       occurrences of the -i option shall be ignored.
    -i
       Prompt for confirmation as described previously. Any previous occurrences
       of the -f option shall be ignored.

và cũng trong infotrang GNU :

‘-f’
‘--force’

    Ignore nonexistent files and missing operands, and never prompt the user.
    Ignore any previous --interactive (-i) option.

‘-i’
    Prompt whether to remove each file. If the response is not affirmative, the
    file is skipped. Ignore any previous --force (-f) option.

Hãy xem những gì xảy ra dưới mui xe:

rmxử lý tùy chọn của nó với getopt(3), cụ thể getopt_long. Hàm này sẽ xử lý các đối số tùy chọn trong dòng lệnh ( **argv) theo thứ tự xuất hiện:

Nếu getopt () được gọi lặp đi lặp lại, nó sẽ trả về liên tiếp từng ký tự tùy chọn từ mỗi thành phần tùy chọn.

Hàm này thường được gọi trong một vòng lặp cho đến khi tất cả các tùy chọn được xử lý. Từ quan điểm chức năng này, các tùy chọn được xử lý theo thứ tự. Tuy nhiên, điều thực sự xảy ra là phụ thuộc vào ứng dụng, vì logic ứng dụng có thể chọn phát hiện các tùy chọn xung đột, ghi đè lên chúng hoặc đưa ra lỗi. Đối với trường hợp rmiflựa chọn, họ hoàn toàn ghi đè eachother. Từ rm.c:

234         case 'f':
235           x.interactive = RMI_NEVER;
236           x.ignore_missing_files = true;
237           prompt_once = false;
238           break;
239 
240         case 'i':
241           x.interactive = RMI_ALWAYS;
242           x.ignore_missing_files = false;
243           prompt_once = false;
244           break;

Cả hai tùy chọn đều đặt cùng một biến và trạng thái của các biến này sẽ là tùy chọn nào là cuối cùng trong dòng lệnh. Hiệu quả của việc này là phù hợp với tiêu chuẩn POSIX và rmtài liệu hướng dẫn.


3
Hầu hết các lệnh xử lý các đối số của chúng theo thứ tự và lỗi về xung đột hoặc thực hiện cài đặt cuối cùng (như rm). Tôi nghĩ rằng rất hiếm khi một lệnh thực hiện cài đặt đầu tiên của một tùy chọn và bỏ qua các đối số sẽ thay đổi tùy chọn đã được đặt.
Peter Cordes

7

Vâng, cho rmđiều này là hợp lệ. Nếu tùy chọn cuối cùng ghi đè lên các tùy chọn trước tuy nhiên phụ thuộc vào chính chương trình riêng lẻ. Từ infoinfoinfo rm

'-f' '--force' Bỏ qua các tệp không tồn tại và các toán hạng bị thiếu và không bao giờ nhắc người dùng. Bỏ qua mọi tùy chọn '- tương tác' ('-i') trước đó.

'-i' Nhắc xem có xóa từng tệp không. Nếu phản hồi không được xác nhận, tập tin sẽ bị bỏ qua. Bỏ qua mọi tùy chọn '--force' ('-f') trước đó. Tương đương với '- tương tác = luôn luôn'.

Như một gợi ý chung: info thường là chi tiết hơn man, mà bản thân nó thường chi tiết hơn --helptùy chọn.


7

Không có "quyền ưu tiên" cho cờ, mỗi chương trình xử lý chúng theo cách nó muốn. Hầu hết đều nỗ lực để thu thập tất cả các cờ và kiểm tra xung đột, đối với các công cụ tiêu chuẩn (như được tham chiếu rm(1)), các tiêu chuẩn có liên quan có thể bắt buộc một cái gì đó (nhưng sau đó, phiên bản cụ thể của bạn có thể cẩu thả trong việc diễn giải các trường hợp góc của tiêu chuẩn / không được kiểm tra cụ thể cho họ).

Đối với các lập trình viên viết chương trình, dễ nhất là xem xét các đối số (cờ và các thứ khác) theo thứ tự nghiêm ngặt từ trái sang phải, và có thể bảo lãnh khi gặp một số khó khăn. Nếu sử dụng một thư viện để xử lý các cờ (như getopt(3), có một số phiên bản nổi xung quanh), lập trình viên có lẽ sẽ làm những gì dễ dàng / tự nhiên nhất. Lập trình viên là người, mọi người lười biếng (hoặc ít nhất là không thích suy nghĩ thông qua vụ nổ tổ hợp).

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.