Apakah urutan opsi perintah di linux penting?

14

Misalnya, ketika saya memasukkan:

gcc -O hello.c -c

Atau

gcc hello.c -c -O

Keduanya tidak mengeluh.

Apakah urutan opsi perintah penting?

bobo
sumber

Jawaban:

18

Ini tergantung pada program itu sendiri; sistem operasi tidak menentukan apakah pesanan itu penting atau tidak.

Seperangkat opsi GCC sangat kolosal sehingga saya tidak bisa mengatakan dengan otoritas apa pun jika Anda dapat menyediakan opsi apa pun dalam urutan sewenang-wenang; Anda harus membaca dokumentasi untuk opsi itu. Yang mengatakan, aturan umum adalah bahwa jika Anda memiliki dua atau lebih opsi yang saling eksklusif (seperti -O1 -O2untuk berbagai tingkat optimasi), program biasanya akan mengambil opsi lebih baru daripada yang sebelumnya. Sekali lagi, ini tidak diberlakukan oleh linux.

Program sederhana yang memungkinkan Anda menentukan sebagian besar opsi dalam urutan apa pun adalah ls. Daftar semua file dalam direktori saat ini dengan detail dapat dilakukan dengan ls -la, ls -alatau ls -l -a. Namun, ls-l1 (yaitu 'el' 'one') tidak memberikan output yang sama dengan ls -1l ('one' 'l'). Ini adalah opsi yang saling eksklusif, dan yang terakhir terdaftar naik wahana yang pertama diberikan.

Ada juga program aneh yang menerapkan opsi untuk argumen saat mereka tiba. Jadi, misalnya, Anda mungkin memiliki perintah hipotetis blah -a 1 2 -b 3di mana -aberlaku untuk semua tiga argumen, tetapi -bhanya berlaku untuk 3.

Sekali lagi, ini tergantung pada program individual yang dimaksud. Jika Anda tidak yakin, baca dokumentasinya.

DK.
sumber
5

Ada kasus di mana urutan opsi baris perintah penting bahkan di GCC. Jika Anda menautkan dengan pustaka statis (.a), maka jika Anda menentukan -llib1 -llib2dan ada fungsi liblib2.ayang memanggil fungsi liblib1.ayang tidak dimasukkan ke dalam program, maka tautan tersebut akan gagal dengan simbol yang belum terselesaikan. Dengan perpustakaan bersama, ini bukan masalah.

Secara umum, seperti yang dikatakan orang lain, urutan opsi mungkin atau mungkin tidak membuat perbedaan. Namun, output dari dua perintah di bawah ini berbeda - sehingga urutan argumen untuk catmengubah output:

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

Perhatikan juga bahwa di Linux (khususnya), GNU getopt()cenderung untuk menyusun ulang baris perintah sehingga semua opsi (dimulai dengan minus) diproses sebelum argumen lain - kecuali Anda menggunakan tanda hubung ganda --untuk menandai akhir dari perintah. argumen, atau kecuali Anda mengatur variabel lingkungan POSIXLY_CORRECT.

Jonathan Leffler
sumber
4

Hanya jika Anda memiliki 2 opsi yang saling eksklusif. Kalau tidak, pesanan tidak masalah.

Tentu saja, ini dapat bervariasi tergantung pada bagaimana program telah ditulis, tetapi harus berlaku untuk semua alat * nix normal.

Dan McGrath
sumber
3

Sulit diketahui, seperti yang sudah dikatakan orang lain mungkin ada bedanya (atau tidak).

Aturan praktis yang baik adalah membuka halaman manual dan melihat contoh pertama dan menggunakan urutan itu ketika meletakkan arg di sana.

Jadi jika kita melihat perintah kucing (kucing pria):

SYNOPSIS
       cat [OPTION] [FILE]...

Sepertinya selama semua opsi ada sebelum file args Anda harus baik-baik saja.

Dan jika kita melihat binatang gcc (man 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.

Ini tidak sesederhana itu untuk dipahami sebagai perintah kucing :)

Tetapi jika Anda ingin bermain aman, -c tampaknya datang sebelum -O dan kemudian infile (hello.c) tampaknya menjadi yang terakhir.

gcc -c -O hello.c

Tapi seperti yang Anda sudah tahu, karena yang lain bekerja ... ini bermain sangat aman :)

Johan
sumber
Bagaimana dengan menghubungkan bendera -static-libstdc++?
Royi