Komut istemi parametreleri için bir çizgi ve iki çizgi arasındaki fark nedir?


65

Neden bazı programların komut satırı parametrelerinin önünde iki çizgi olmasını gerektirdiğini, bazılarının (çoğu) sadece önünde bir çizgi olmasını gerektirdiğini merak ediyordum.

Örneğin, çoğu program şöyle görünür: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

Bazı programlar bu gibi gözükse de: xmllint --valid toc.xml --noout

Bazılarının bir yerine iki çizgi gerektirmesinin nedeni nedir? Herkesin bir standarda sadık olması mantıklı gelmiyor mu (yani tek bir çizgi yapacak).


10
> Herkesin bir standarda sadık olması mantıklı değil mi - evet. Tüm programcılar standartlara uyuyor ve tutarlılığı koruyor mu? Hayır Birçok programcı bile içinde tutarlılığı korumak olamaz onların programlarının :) söyleniyor, konsensüs tek harfli seçenekleri için bir çizgi ve aslında mesela sözleri, hepsi için iki tire kullanmak olacaktır -ivs --inputya -n --dry-run.
slhck

1
@slhck Heys yardım için teşekkürler =) O zamana göre, bu kongre -dtdgerçekten olması gereken anlamına --dtdmı geliyor? Tire (ve çift çizgi) ne Etkili ne merak ediyordum olduğu çalışıyor delalet?
Pacerier

6
Bonus puanlar için: Gnu standartlarına uyan programlar, --long-optionsherhangi bir benzersiz kısaltmayı da kabul edecektir. Yani, seçenekli bir program için --file-inve --file-outşunu kullanabilirsiniz --file-o=fooveya --file-i=foobazı yazarak kaydedebileceğiniz, --very-long-optional-parameters.
BRPocock

GNU Böyle X Pencere Sistemi yanı sıra Imagemagick ile birlikte olanlar gibi tercihim olur "uzun" seçeneklerinde, ancak birçok eski kamu hizmetleri, iki tire kullanarak kendi kongre ile birlikte geldi ( örn , convert, mogrify) de "uzun" sadece tek bir çizgi kullanarak seçenekler. Örneğin: xterm -fn 6x10 -geometry 80x24+30+200. Kısaltmalar, desteklenen onlar (farklı konum sağlanmaktadır örneğin , -gya da -geomiçin -geometry). Diğer örnekler için bakınız X (7) .
TheDudeAbides

Yanıtlar:


18

Sadece yap ls --help ve seçeneklere bak; senin için açık olmalı.

Parametrelerle hiçbir ilgisi yok. Pek çok seçeneğin kısa bir formu ve uzun bir formu vardır ve çoğunun bir diğeri vardır.

Ve ayrıca, parametrelerle ilgili olarak, basitçe, uzun formda bir parametre aldıklarında, her zaman eşittir gibi göründüğü şeklindedir. Fakat belli ki kısa olanlar da aynı şekilde parametre alabilir; sadece eşit kullanmazlar.

İşte bir özü ls --help( man lseşdeğer bilgi verir). Bazı kısa formu (olmadan uzun form var Fark nasıl --author, --block-size), bazı uzun bir formda (olmadan kısa bir form var -c, -f, -g) ve bazı uzun form ve kısa bir form (her ikisine de sahip -A/ --almost-all, -b/ --escape).

 -a, --all                  do not ignore entries starting with .
 -A, --almost-all           do not list implied . and ..
     --author               with -l, print the author of each file
 -b, --escape               print octal escapes for nongraphic characters
     --block-size=SIZE      use SIZE-byte blocks
 -B, --ignore-backups       do not list implied entries ending with ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be `never', `always', or `auto'

4
ls --helpPencerelerde nasıl yaparız ?
Pacerier

1
@Pacerier lsWindows'da yok . Eşdeğer komut olacaktır dir /?. Her zamanki Windows kurallarını ihlal eden çapraz platform yazılımı kullanıyorsunuz, cevabımı görün.
Daniel Beck

@Pacerier Dahili değil, ancak 3. tarafa indirin, Gnuwin32 siz indirin (google gnuwin32). gnuwin32 içinde her biri komutları olan, birçok ortak komutu olan coreutils paketini indiren bir sürü paket var.
barlop

ls --helpAlıntılarınızda kısa seçeneksiz uzun seçenekler var . Bkz --authorve --block-size.
Dan

@ Pacerier'in orijinal yorumundaki soruyu cevaplamak için: Modern Windows sistemlerinin lskomut almasının en yaygın yolu GIT üzerindendir . PATH içinde GIT bölmesi bulunan GIT bash kabuğu veya CMD penceresi olacaktır ls.
yzorg

34

Yaygın bir standart yoktur. Örneğin GNU programlarında bir miktar tutarlılık var, ancak her programın belgelerini kontrol etmeniz gerekiyor.

Vikipedi alıntı , benimki vurgu:

Unix benzeri sistemlerde, ASCII kısa çizgi – eksi genellikle seçenekleri belirlemek için kullanılır. Karakteri genellikle bir veya daha fazla harf izler . Harfsiz tek başına kısa çizgi eksi olan bir argüman genellikle bir programın standart girdiden gelen verileri işlemesi veya standart çıktıya veri göndermesi gerektiğini belirtir. Daha açıklayıcı seçenek adlarının kullanıldığı "uzun seçenekler" i belirtmek için bazı programlarda iki kısa çizgi eksi karakteri (-) kullanılır . Bu GNU yazılımının ortak bir özelliğidir.

Genellikle, tire, önceden tanımlanmış bir argüman gösterir. Bunları, örneğin dosya adlarından veya argüman olarak kullanabileceğiniz diğer etiketlerden ayırmak için kullanıldığını düşünüyorum. Yine de her zaman durum böyle değil (aşağıya bakınız).


Sık sık, hem ls hem de kısa olan seçenek olarak aynı argümanı bulacaksınız .

Bazı programlar tek karakterli seçenekler için tek bir tire ve çok karakterli seçenekler için iki kısa çizgi kullanır, ancak tümü değil (GNU findakla gelir). Bazı programlarda isteğe bağlı tireler vardır veya bunları tamamen atlarlar ( tarveya BSD psakla gelir).

Bazen uzun seçenekler ( --foo) bağımsız değişkenler gerektirir, kısa seçenekler ( -f) ise (veya en azından belirli bir varsayılan değişken anlamına gelir).

Kısa seçenekler (örneğin cut -d ' ') argümanlara sahip olabilir, uzun seçenekler (örn. ls --all) Mutlaka buna sahip değildir.

Bir programın belirli bir davranışını ayarlamak için, bazen kısa bir seçenek kullanmanız gerekir, diğerleri için uzun bir seçenek kullanmanız gerekir ve bazıları için bir seçeneğiniz vardır.

İlgili bir notta, bazı programlar bir seçenek ile argümanı arasında boşluk bırakmazken, diğerleri bunu yapamaz.

Başlangıçta yazdığım gibi, ortak bir davranış veya standart yoktur. Genellikle, argüman ayrıştırma için kullanılan aynı kütüphaneye benzer davranışları takip edebilirsiniz, ancak muhtemelen bunu bulmak için kaynakları okumak istemezsiniz.

Bir programın argüman sözdizimini diğerinin ifadesinden gerçekten çıkaramazsınız.


Ayrıca, Windows'u göz önünde bulundurursanız, daha da kötüleşir: Windows komut satırı, geleneksel olarak kullanımları çağırırken /f(en azından çoğu zaman, tek karakterler), :seçenekler ve değerleri arasındaki ayırıcı olarak seçenekler için (bkz. Örneğin, burada ); platformlar arası yardımcı programlar yaygındır (bahsettiğinizler gibi) ve yukarıda belirtilen tüm tutarsızlıklar ile argümanlar için daha yaygın tire sözdizimini beraberinde getirir.


2
GNU standart kütüphanelerinin, bir-eksi-bir-harf, iki-eksi-çok harfli seçeneklerin haritalanması işlevini sağladığına dikkat edilmelidir, bu nedenle tüm yeni GNU programları ve genel olarak en yeni ücretsiz yazılımlar bu gösterimi kullanır (örn. f, -f foo, --file, --file foo, --file = foo, --file = foo, - fi = foo); gibi saksafonun tar, ps, findbu standart tamamen jelleştiğinde önce POSIX tarafından belirlenen ve bu tür vardı onların komut satırı sözdizimi. Bir Gnu / Linux sisteminde, en azından (hemen hemen) her zaman desteklenecek makul derecede güvenli bir bahis veya--helpman <command>info <command>
BRPocock

GNU standardı, uzun bir form olmadan kısa bir forma sahip olmamanız ve kısa bir form olmadan uzun bir zamana sahip olmamanız gerektiğini söylüyor mu?
barlop

findUzun seçenekler için "GNU konvansiyonunu" izlemeyen GNU'dan bahsetmek de dahil olmak üzere en eksiksiz cevap olduğu için +1 (muhtemelen @ BRPocock'un işaret ettiği gibi POSIX uyumluluk nedenleriyle). OP'in sorusu bir şekilde "windows" olarak etiketlendiğinden ve DOS / Windows komut satırında "switch" den bahsedebilseydim tekrar +1 yapardım ve bu kuralın bütünlüğü için belirtilmeliydi.
TheDudeAbides

7

Bu * nix'ten gelen bir kongredir. Çift tire , tam olarak yazıldığında seçeneklerden önce gelirken, tek tire kısa biçiminde yazıldığında seçeneklerden önce gelir . Örneğin ls --all --l, kısaltılabilir ls -al. Görüldüğü gibi, daha çok kullanılanlar genelde olmasına rağmen, tüm seçeneklerin tek harfli eşdeğerleri yoktur.

Seçeneğin bir argüman alıp almadığı gerçekten bir fark yaratmaz - seçeneğe ne şekilde girdiğinizden bağımsız olarak onları alabilir veya alabilir.

Bunları bir kez kullanmak için yazarken, bu gerçekten önemli değil, ancak örneğin .alias dosyalarına komutlar yazarken, tam formu kullanmak gelenekseldir. Sadece bir sonraki kişi için okuma kolaylığı için.


Yardımınız için teşekkürler, Btw, unix * nix yazmanızın bir nedeni var mı?
Pacerier

2
@Pacerier - Unix bir ticari isimdir. * Nix yazarak, aslında tüm pratik amaçlar için aynı olan tüm unix ve benzeri sistemlere atıfta bulunuyorum. Ama çoğunlukla, bu bir alışkanlık kuvveti ...
Rook

2
@Pacerier * nix Linux veya Unix anlamına gelebilir. Bundan tam olarak emin değilim 'çünkü bir süre önce araştırdım, ama Teknik olarak, hatırlarsam BSD Unix ailesindendi. Linux teknik olarak .. ve FreeBSD de değildir. Ama * nix demek, unix / bsd'yi ve bunun gibi bir şeyi içerecektir, örneğin linux ve freebsd.
barlop

2
Kısayol komutunu birleştirmekten bahsetmek için +1. İki tarzın olmasının gerçek nedeni budur .
Ryan_S

3

bunlar geleneksel UNIX sözdizimleridir,

Bir program argümanı, basit bir seçenek olduğunda (örneğin: -v ) basit bir seçenek ( ve: --dosyası toc.xml alırken, iki kısa çizgi ("-") izler. veya --file = toc.xml )

programın işlevselliği üzerinde hiçbir etkisi yoktur.


3
Ayrıca, çoğu durumda tek bir tire işaretini izleyen tek harf seçenekleri olan harfleri birlikte gruplayabilirsiniz. Örneğin, "ls -al", "ls -a -l" ile aynıdır. Çift çizgi seçenekleri bu şekilde birleştirilemez. Tek harfli seçenekler eski bir standarttır, ancak bugünlerde birçok komut her iki türü de alacaktır. Örneğin, "ls --all", "ls -a" ile aynıdır.
Randy Orrison

3
Aslında, başka bir düzeltme. Tek çizgi tek harfli seçenekler bir parametre alabilir, ancak bu genellikle eşittir işaretiyle ilişkilendirilmez. Örneğin, "tail -n 50", bir dosyanın son 50 satırını, "tail --lines = 50" ifadesine eşdeğer gösterir.
Randy Orrison

Bu sözleşme ile, --noout(yukarıdaki soruda) -noout, tartışmaya sahip olmadığı için gerçekten yazılmış olması gerektiği anlamına mı geliyor?
Pacerier

1
Bu cevapta parametreler hakkında söylenenler tamamen yanlıştır. İlk cümle açıktır. Son cümle açıktır. Ve ortadaki soruyu yanıtlaması gereken paragraf tamamen yanlıştır.
barlop

@RandyOrrison hiç bir zaman bir eşittir işareti görmedim .. ve noktanızı geliştirmek için sık sık parametreler alırlar .. wget -w 10 kafa -n 3 cut -b 2 Ve Ping -? !! Yükler parametre alır. Bu cevap korkunç
barlop

3

tek çizgi getopt tarafından uygulanır ve posix standart fonksiyon, getopt_long içinde çift çizgi ve bir gnu standardıdır.

Geleneksel olarak, tek bir çizgi şöyle bir tek karakter seçeneği sağlar:

-A veya -V vb., Ancak bununla sınırlı olması gerekmez. örneğin -ccc için gcc, gcc derleyici komutu için tüm derleyici uyarılarını açar.

çift ​​çizgi argümanları daha ayrıntılı olma eğilimindedir ve genellikle --max-count = NUM ​​gibi verilen bir parametre alır. Ancak, --version eşit değildir.

Genel olarak konuşursak, program argümanlarının nasıl tanımlanması gerektiğine dair bir kural veya tanımlanmış standart yoktur, sadece bir grup gelenek vardır. Bununla birlikte, getopt ve getopt_long komut satırı ayrıştırma işlevleri kullanılıyorsa, kütüphane işlevleri bunu yapmanın belirli bir yolunu zorladığından parametreler genellikle standarda uymalıdır.

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.