Jaka jest różnica między flagami pojedynczego i podwójnego myślnika w poleceniach powłoki?

70

Jestem nowy w pracy w powłoce, a użycie tych poleceń wydaje się arbitralne. Czy istnieje powód, dla którego jedna flaga ma jedną kreskę, a inna może mieć podwójną kreskę?

Kylex
źródło
Powinien być regulowany przez standard POSIX: iam.ubc.ca/guides/javatut99/essential/attributes/_posix.html
cjc
Ten link ma teraz 404 @cjc :( Prawdopodobnie bardziej wiarygodnym linkiem może być en.wikipedia.org/wiki/POSIX
Bernhard Hofmann
Lepszy link: en.wikipedia.org/wiki/…
Craig Fisher

Odpowiedzi:

110

Po jednym łączniku mogą występować flagi jednoznakowe. Podwójny łącznik poprzedza pojedynczą opcję wieloznakową.

Rozważ ten przykład:

tar -czf

W tym przykładzie -czfokreśla trzy flagi pojedynczych znaków: c, z, i f.

Teraz rozważ inny przykład:

tar --exclude

W takim przypadku --excludeokreśla pojedynczą opcję wieloznakową o nazwie exclude. Podwójny łącznik disambiguates argument wiersza polecenia, zapewniając, że tarinterpretuje go jako excludezamiast kombinacji e, x, c, l, u, d, i e.

psusi
źródło
1
@kylex, nie, ponieważ nie ma długiej opcji o nazwie tylko „c”, a - oznacza długą opcję, a nie następująca po niej opcja jednego znaku.
psusi
13
Czasami nawet długie polecenia mogą być przerywane. Na przykład „cdrecord” używa wszystkich poleceń z pojedynczą kreską (-eject -dao ...). Wszystko zależy od programu, ale większość (!) Z nich używa - do poleceń pojedynczych i - do poleceń
składających się
8
@mulaz, tak, cdrecord robi sporo niemądrych rzeczy.
psusi
10
należy również pamiętać - używany samodzielnie oznacza zwykle koniec opcji. patrz tutaj, aby uzyskać więcej informacji: unix.stackexchange.com/questions/11376/...
Sirex
3
@killjoy, ponieważ czy to przez ignorancję, czy wybór, autorzy tych programów nie przestrzegali oczywiście konwencji. Tak jak cdrecordwspomniano lata temu w powyższych komentarzach.
psusi
17

Wszystko zależy od programu. Zwykle „-” jest używane w przypadku opcji „krótkich” (jedna litera, -h), a „-” jest używane w przypadku opcji „długich” (er) (--help).

Krótkie opcje zwykle można łączyć (więc „-h -a” jest takie samo jak „-ha”)

W systemach uniksopodobnych do określania opcji powszechnie stosuje się łącznik minus ASCII. Po znaku zwykle występuje jedna lub więcej liter. Argument, który jest pojedynczym łącznikiem minus sam w sobie bez liter, zwykle określa, że ​​program powinien obsługiwać dane pochodzące ze standardowego wejścia lub wysyłać dane na standardowe wyjście. W niektórych programach używane są dwa znaki łącznika minus (-) w celu określenia „długich opcji”, w których używane są bardziej opisowe nazwy opcji. Jest to wspólna cecha oprogramowania GNU.

źródło

mulaz
źródło
2
Dlaczego więc jest to wersja java i wersja ant?
killjoy
7

To naprawdę konwencja. Może jednak pomóc parserom w bardziej efektywnym poznaniu opcji przekazanych do programu. Poza tym istnieją porządne narzędzia, które mogą pomóc w analizie tych poleceń, takie jak getopt(3)niestandardowe narzędzia getopt_long(3)do analizy argumentów programu.

To miłe, ponieważ możemy połączyć wiele krótkich opcji, jak mówią inne odpowiedzi tar -xzf myfile.tar.gz.

Gdyby istniał argument „Lisa” ls, prawdopodobnie miałby inne znaczenie ls -lisaniż typ ls --lisa. Były to l, i, soraz aparametry, a nie słowa.

W rzeczywistości możesz pisać ls -l -i -s -a, co oznacza dokładnie to samo co ls -lisa, ale to zależy od programu.

Istnieją również programy, które nie przestrzegają tej konwencji. Szczególnie dla mojego wzroku ddi gcc.

ssice
źródło
3

krótkie opcje z pojedynczym myślnikiem vs. długie opcje z podwójnym myślnikiem

krótkie opcje można łączyć w jeden argument;

for example: ls -lrt #instead of ls -l -r -t

Jeśli pozwolimy na długie opcje z jednym myślnikiem, spowoduje to niejednoznaczność. Aby rozwiązać ten problem, używamy podwójnego myślnika dla długich opcji.

Premraj
źródło