Linux'ta komut seçeneklerinin sırası önemli mi?


15

Örneğin, her ikisini de girdiğimde:

gcc -O hello.c -c

Veya

gcc hello.c -c -O

Her ikisi de şikayet etmedi.

Komut seçeneklerinin sırası önemli mi?

Yanıtlar:


19

Bu, programın kendisine bağlıdır; işletim sistemi, siparişin önemli olup olmadığını belirlemez.

GCC'nin seçenekler kümesi o kadar muazzam ki, herhangi bir seçeneği keyfi sırada sağlayabiliyorsanız herhangi bir otorite ile söyleyemem ; bu seçeneğin belgelerini okumalısınız. Bununla birlikte, genel bir kural, iki veya daha fazla birbirini dışlayan seçeneğiniz varsa ( -O1 -O2farklı optimizasyon seviyeleri için), programların genellikle önceki seçeneklere göre daha sonraki seçenekleri alacağıdır. Yine, bu linux tarafından uygulanmıyor.

Çoğu seçeneği herhangi bir sırayla belirtmenize izin veren basit bir program olacaktır ls. Ayrıntılarla geçerli dizindeki tüm dosyaları listeleme biriyle yapılabilir ls -la, ls -alya da ls -l -a. Ancak, ls -l1 (yani 'el' 'one') ls -1l ('one' 'l') ile aynı çıktıyı vermez. Bunlar birbirini dışlayan seçeneklerdir ve son listelenen ilk verilen sürmek.

Ayrıca, argümanlara ulaştıkça seçenekleri uygulayan tek bir program da vardır. Yani, örneğin, bir varsayımsal komutu olabilir her üç argüman için geçerlidir, ancak yalnızca için geçerlidir .blah -a 1 2 -b 3-a-b3

Yine, bu söz konusu bireysel programa bağlıdır. Emin değilseniz, belgeleri okuyun.


BTW, ls -al path/to/dirgeçerli, ancak geçerli ls path/to/dir -aldeğil. Bu nedenle ls, seçeneklerinizi, içeriğini listelemek istediğiniz (isteğe bağlı) dizinin önüne koymanız gerekir.
jvriesem

6

GCC'de bile komut satırı seçeneklerinin sırasının önemli olduğu durumlar vardır. Statik kitaplıklarla (.a) bağlantı kuruyorsanız, o zaman belirtirseniz -llib1 -llib2ve programa getirilmemiş liblib2.abir işlevi çağıran bir işlev liblib1.avarsa, bağlantı çözülmemiş bir sembolle başarısız olur. Paylaşılan kitaplıklarda bu bir sorun oluşturmaz.

Genel olarak, diğerlerinin söylediği gibi, seçeneklerin sırası bir fark yaratabilir veya etmeyebilir. Ancak, aşağıdaki iki komuttan alınan çıktı farklıdır cat;

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

(Özellikle) Linux üzerinde, GNU da unutmayın getopt()çift çizgi kullanın sürece - diğer değişkenlerden herhangi biri önce bu nedenle tüm seçenekler (eksi ile başlayan) işlenmesini komut satırını yeniden düzenlemek için apt --sonunu işaretlemek için veya ortam değişkenini POSIXLY_CORRECT olarak ayarlamadığınız sürece.


4

Yalnızca birbirini dışlayan 2 seçeneğiniz varsa. Aksi takdirde, düzen önemli değildir.

Tabii ki, bu programın nasıl yazıldığına bağlı olarak değişebilir, ancak tüm normal * nix araçlarına uygulanmalıdır.


3

Bilmek zor, diğerlerinin size söylediği gibi bir fark yaratabilir (ya da olmayabilir).

İyi bir kural, man sayfasını açmak ve ilk örneğe bakmak ve arg'u oraya koyarken bu sırayı kullanmaktır.

Eğer kedi komutuna bakarsak (adam kedi):

SYNOPSIS
       cat [OPTION] [FILE]...

Tüm seçenekler dosya argümanlarından önce olduğu sürece iyi olmalıydı.

Ve eğer gcc canavarına bakarsak (adam 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.

Kedi komutu olarak anlamak o kadar da kolay değil :)

Ama eğer güvenli oynamak istiyorsanız, -c daha önce gelmiş gibi görünüyor -O sonra da infile (merhaba.c) son gibi görünüyor.

gcc -c -O hello.c

Ama bildiğiniz gibi, diğerleri çalıştığı için ... bu çok güvenli oynuyor :)


Bayrakları nasıl bağlamaya ne dersiniz -static-libstdc++?
Royi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.