Liệu thứ tự của các tùy chọn lệnh trong linux có vấn đề?


14

Ví dụ: khi tôi nhập một trong hai:

gcc -O hello.c -c

Hoặc là

gcc hello.c -c -O

Cả hai đều không phàn nàn.

Liệu thứ tự của các tùy chọn lệnh có vấn đề?

Câu trả lời:


18

Điều này phụ thuộc vào chính chương trình; hệ điều hành không ra lệnh cho dù có hay không vấn đề.

Tập hợp các tùy chọn của GCC rất tuyệt vời mà tôi không thể nói với bất kỳ cơ quan nào nếu bạn có thể cung cấp bất kỳ tùy chọn nào theo thứ tự tùy ý; bạn sẽ phải đọc tài liệu cho tùy chọn đó. Điều đó nói rằng, một nguyên tắc chung là nếu bạn có hai hoặc nhiều tùy chọn loại trừ lẫn nhau (chẳng hạn như -O1 -O2các mức độ tối ưu hóa khác nhau), các chương trình thường sẽ có các tùy chọn sau hơn các tùy chọn trước đó. Một lần nữa, điều này không được thi hành bởi linux.

Một chương trình đơn giản cho phép bạn chỉ định hầu hết các tùy chọn theo bất kỳ thứ tự nào ls. Liệt kê tất cả các tệp trong thư mục hiện tại với chi tiết có thể được thực hiện bằng ls -la, ls -alhoặc ls -l -a. Tuy nhiên, ls -l1 (nghĩa là 'el' 'one') không cho cùng một đầu ra như ls -1l ('one' 'l'). Đây là các tùy chọn loại trừ lẫn nhau, và cuối cùng được liệt kê trên cưỡi đầu tiên được đưa ra.

Ngoài ra còn có chương trình kỳ lạ áp dụng các tùy chọn cho các đối số khi chúng đến. Vì vậy, ví dụ, bạn có thể có một lệnh giả thuyết blah -a 1 2 -b 3nơi -aáp dụng cho cả ba đối số, nhưng -bchỉ áp dụng cho 3.

Một lần nữa, điều này tùy thuộc vào chương trình cá nhân. Nếu bạn không chắc chắn, hãy đọc tài liệu.


5

Có những trường hợp thứ tự các tùy chọn dòng lệnh quan trọng ngay cả trong GCC. Nếu bạn đang liên kết với các thư viện tĩnh (.a), thì nếu bạn chỉ định -llib1 -llib2và có một hàm trong liblib2.ađó gọi một hàm trong liblib1.ađó không được đưa vào chương trình, thì liên kết sẽ thất bại với một biểu tượng chưa được giải quyết. Với các thư viện chia sẻ, đây không phải là một vấn đề.

Nói chung, như những người khác nói, thứ tự của các tùy chọn có thể hoặc không thể tạo ra sự khác biệt. Tuy nhiên, đầu ra từ hai lệnh bên dưới là khác nhau - vì vậy thứ tự của các đối số để catthay đổi đầu ra:

cat /etc/passwd /etc/group
cat /etc/group  /etc/passwd

Cũng lưu ý rằng trên Linux (đặc biệt), GNU getopt()có khả năng sắp xếp lại dòng lệnh để tất cả các tùy chọn (bắt đầu bằng dấu trừ) được xử lý trước bất kỳ đối số nào khác - trừ khi bạn sử dụng dấu gạch ngang kép --để đánh dấu kết thúc của đối số hoặc trừ khi bạn đặt biến môi trường POSIXLY_CORRECT.


4

Chỉ khi bạn có 2 tùy chọn loại trừ lẫn nhau. Nếu không, thứ tự không quan trọng.

Tất nhiên, điều này có thể thay đổi tùy thuộc vào cách chương trình đã được viết, nhưng nên áp dụng cho tất cả các công cụ * nix bình thường.


3

Khó biết, như những người khác đã nói với bạn, nó có thể tạo ra sự khác biệt (hoặc không).

Một nguyên tắc nhỏ là mở trang man và xem ví dụ đầu tiên và sử dụng thứ tự đó khi đặt arg vào đó.

Vì vậy, nếu chúng ta nhìn vào lệnh mèo (man cat):

SYNOPSIS
       cat [OPTION] [FILE]...

Có vẻ như miễn là tất cả các tùy chọn là trước khi tệp lập luận bạn sẽ ổn.

Và nếu chúng ta nhìn vào con thú gcc (người đàn ông gcc):

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-pedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...

       Only the most useful options are listed here; see below for the remainder.  g++ accepts mostly
       the same options as gcc.

Nó không đơn giản để hiểu như lệnh mèo :)

Nhưng nếu bạn muốn chơi nó an toàn, -c dường như đến trước -O và sau đó infile (hello.c) dường như là cuối cùng.

gcc -c -O hello.c

Nhưng như bạn đã biết, vì những người khác làm việc ... điều này đang chơi rất an toàn :)


Những gì về liên kết cờ như thế -static-libstdc++nào?
Royi
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.