Seçenekler ve parametreler arasındaki boşluklar neden atlanabilir?


16

Örneğin:

xargs -n 1

aynıdır

xargs -n1

Ancak man sayfasına bakarsanız , seçenek olarak listelenir -n max-args, bu da alanın korunması gerektiği anlamına gelir. Kısaltılmış form -n max-args hakkında hiçbir şey yoktur .

Bu, diğer birçok Linux yardımcı programında da olur.

Linux'ta buna ne denir? Tüm yardımcı programlar kısaltılmış formu destekliyor mu (ancak bunu asla man sayfasında belgelemeyin)?


1
12.1.2.a tarihin bir kısmıdır ; Yemin ederim ki bu konuda zaten iyi bir soru var ama henüz bulamadım.

2
@drewbenn düşündüğünüz diğer soru benim olabilir: unix.stackexchange.com/q/188046/41515

Yanıtlar:


12

Kodunuzun ayrıştırma bitini komut satırı yazdığınızda, hangi seçeneklerin bağımsız değişken alacağını ve hangilerinin almadığını belirtirsiniz. Örneğin, bir -hseçeneği (örneğin yardım için) ve -abağımsız değişken alması gereken bir seçeneği kabul eden bir kabuk komut dosyasında ,

opt_h=0     # default value
opt_a=""

while getopts 'a:h' opt; do
    case $opt in
        h)  opt_h=1 ;;
        a)  opt_a="$OPTARG" ;;
    esac
done

echo "h: $opt_h"
echo "a: $opt_a"

a:hBit "Ben iki seçenek ayrıştırmak bekliyorum diyor -ave -hve -abir argüman almalıdır" (bu kadar :sonra ao ayrıştırıcı söyler -abir argüman alır).

Bu nedenle, bir seçeneğin nerede bittiği, değerinin nerede başladığı ve bundan sonra başka bir seçeneğin nerede başladığı konusunda hiçbir belirsizlik yoktur.

Koşu:

$ bash test.sh -h -a hello
h: 1
a: hello

$ bash test.sh -h -ahello
h: 1
a: hello

$ bash test.sh -hahello
h: 1
a: hello

Bu nedenle, seçenekleri ayrıştırmak için çoğu zaman kendi komut satırı ayrıştırıcısını yazmamalısınız.

Bu örnekte zor olan tek bir durum var. Ayrıştırma genellikle ilk olmayan seçenekte durur, bu nedenle komut satırında seçeneklere benzeyen şeyler olduğunda :

$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello

Aşağıdakiler bunu çözer:

$ bash test.sh -a hello -- -world
h: 0
a: hello

--Sinyaller komut satırı seçeneklerinin bir uç ve -worldbiraz da (o pozisyonel değişkenlerden birinin içinde) ne isterse yapmaya program için bırakılır.

Bu arada, dosya adının başında tire işareti olan bir dosyayı nasıl kaldırdığınızdır rm.

DÜZENLE :

C çağrısında getopt()(beyan edilen unistd.h) yazılan yardımcı programlar hemen hemen aynı şekilde çalışır. Aslında, bildiğimiz her şey için, bashfonksiyon getoptsC kütüphanesi fonksiyonuna bir çağrı kullanılarak uygulanabilir getopt(). Perl, Python ve diğer diller benzer komut satırı ayrıştırma kitaplıklarına sahiptir ve büyük olasılıkla ayrıştırmalarını benzer şekilde yaparlar.

Bu getoptve getoptbenzeri kütüphane rutinlerinden bazıları "uzun" seçenekleri de işler. Bunlar edilir genellikle çift çizgi (öncesinde --örneğin sık sık argümanları alır eşit işaretinden sonra yapar) ve uzun seçenekleri --block-size=SIZEseçeneği [bazı uygulamaları] du(ayrıca izin veren yardımcı -B SIZEaynı şeyi belirtmek için).

Kılavuzlar genellikle kısa seçenekler ve argümanları arasında bir boşluk göstermek için yazılır, muhtemelen okunabilirlik içindir.

DÜZENLEME : ve yardımcı programları gibi gerçekten eski araçlar önlerinde tire işareti olmayan seçeneklere sahiptir. Bu tamamen tarihsel nedenlerden ve tam da bu şekilde çalışmalarına dayanan yazılımlarla uyumluluğu sağlamak içindir. Yardımcı program, son zamanlarda tire ile seçenek alma yeteneği kazandı. BSD kılavuzu, "paket bayrakları" için eski stil seçeneklerini çağırır.ddtartartar


Bu özelliğin bash komut dosyasında uygulanması kolay görünebilir. Ama çoğu yardımcı program bash değil C (daha sonra ikili dosyalara derlenmiş) yazılmıştır düşünüyorum. Bu yardımcı programlar neden bu özelliği uyguluyor?
J.Joe

@ J.Joe Çünkü aynı şeyi yapan getopt()(ilan edildi unistd.h) diyorlar .
Kusalananda

2
Evet, haklısın. Referans . Bu, seçeneklerin birleştirilebileceği başka bir gizemi de çözüyor -a -b=== -ab
J.Joe

1
Bayraklar için isteğe bağlı bağımsız değişkenler bir belirsizlik yaratır, bu nedenle birleştirilemezler ( -aisteğe bağlı bağımsız değişken varsa , -abaynı değildir -a -b). GNU getopt, bir bayrak dışı bayrakla karşılaşıldığında bayrakların işlenmesini durdurmaz: bunun yerine (varsayılan olarak), bunun yerine bayrakları argv'nin önüne yeniden karıştırır.
ilkkachu

@ilkkachu Bu açıklama için teşekkürler. Cevabımı daha sonra güncelleyebilirim.
Kusalananda

4

xargsPOSIX yardımcı programlarından biridir. @Drewbenn tarafından yorumlandığı gibi POSIX , yardımcı programlarının çoğunun eşleşmesi için seçenek ayrıştırma davranışını getopt, 12.1 Yardımcı Program Bağımsız Değişimi Sözdizimi'nde diğer uygulamalara yönelik bazı izinlerle belgelemektedir :

Bu bölümde standart yardımcı programların bağımsız değişken sözdizimi açıklanmakta ve yardımcı programlar tarafından işlenen bağımsız değişkenleri tanımlamak için POSIX.1-2008 boyunca kullanılan terminoloji tanıtılmaktadır.

POSIX.1-2008 içinde, bir yardımcı programın argümanlarının sözdizimini tanımlamak için özel bir gösterim kullanılır. Aksi belirtilmedikçe , tüm yardımcı program açıklamaları, bu örnekle gösterilen bu gösterimi kullanır (bkz. XCU Basit Komutları ):

ve sonuçlandırmak

Gelecekteki tüm yardımcı programların ve uygulamaların, kullanıcı taşınabilirliğini artırmak için bu yönergeleri kullanmaları önerilir. Bazı tarihsel yardımcı programların değiştirilememesi (mevcut uygulamaların bozulmasını önlemek için) bu gelecekteki hedefi engellememelidir.

POSIX içinde (yalnızca en sık kullanılan yardımcı programları kapsadığını unutmayın), diğer yardımcı programlarda konumsal parametreler veya özel sözdizimine sahip parametreler olarak seçenek olabilecek işlenenleri geçen istisnalar vardır :

POSIX isteğe bağlı seçenek değerlerine izin verir :

Option argümanı <blank>, seçenek argümanının içine alındığı '['ve ']'gösterimin isteğe bağlı olduğunu belirten durumlar hariç , seçeneklerinden karakterlerle ayrılmış olarak gösterilir .

Hazırlıksız olarak, hangi POSIX yardımcı programlarının özelliği kullandığını hatırlamıyorum. Ncurses'in ticve infocmpyardımcı programlar için özelliği kullanmak seviyeleri arasında -v(ayrıntılı / debug) seçeneği.

Sorduğunuz belirli nokta, paragrafın geri kalanında, birkaç satırda ayrıntılı olarak açıklanmaktadır.

POSIX'ten önce, psönde gelen kısa çizgi olmadan kabul edilen seçeneklerin bazı uygulamaları . POSIX açıklaması, yardımcı programın açıklamasında veya sözdizimi gerekçesinde bahsetmez:

POSIX'in yanı sıra , bir seçeneğin değerini seçeneğe ayırmak veya birleştirmek için çeşitli yollar kullanarak uzun seçenek uygulamaları (GNU getopt_long veya X Toolkit gibi ) vardır. Örneğin, noktalama işaretleri kullanılabilir:

--option=value
--option value

Uygulamaya bağlı olarak, uzun seçenekleri kısatan (getopt) ayırmak için çift tire kullanılabilir / kullanılamaz: vaşak ve X Araç Seti tek bir tire kullanır; GNU getopt_long, örneğin çift çizgi kullanır. Ayrıca a +, bir seçeneğin reddedildiğini belirtmek için kullanılabilir.

POSIX'in açıklaması bunlardan hiçbirinden bahsetmiyor gibi görünüyor, ancak kesinlikle bunlarla karşılaşmanız muhtemeldir.


Is -option=valueolması gerekiyordu --option=value(uzun seçenek biçimi yerine birini başında iki tire)?
J.Joe

Birkaç eski yardımcı program, tek satırlık uzun seçenekler (-option) kullanır, ancak yeni komut dosyaları ve programlar için büyük ölçüde kullanımdan kaldırılır. Getopt tarafından kullanılan kısa seçenekler için tek bir tire işareti kullanın. Hemen hemen tüm yeni komut dosyaları ve programlar çift kısa çizgi seçenekleri kullanır. Birçoğu, en sık kullanılanlar için tek tire kısa seçenek eşdeğerlerini de destekler. Uzun seçenekler komut dosyası kodunu çok daha fazla kendi kendini belgelendirerek daha az yoruma ihtiyaç duyar.
DocSalvager
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.