Stile di opzioni della riga di comando - POSIX o cosa?

14

Da qualche parte ho visto una sfuriata contro java / javac usando presumibilmente un mix di stile Windows e Unix come

java -classpath ... -ea ... Something

IMHO, non è un mix, è come funziona anche find , non è vero? AFAIK, secondo POSIX, la sintassi dovrebbe essere come

java --classpath ... --ea ... Something

e -abcdef significherebbe specificare 6 brevi opzioni contemporaneamente. Mi chiedo quale versione conduca in generale a meno digitando e meno errori.

Sto scrivendo una piccola utility in Java e in nessun caso userò lo stile di Windows /a /b poiché sono interessato principalmente a Unix. Quale stile dovrei scegliere?

    
posta maaartinus 21.04.2011 - 22:44
fonte

4 risposte

19

Puoi trovare le convenzioni degli argomenti POSIX nel capitolo Convenzioni di utilità . Lo stile POSIX è composto da opzioni con un trattino singolo seguito da una singola lettera che indica l'opzione, con il valore dell'argomento separato dall'opzione da uno spazio.

Ci sono eccezioni alle regole - find , per esempio - ma queste sono a causa dei precedenti storici di Unix.

X Windows (X11) utilizza find , come le opzioni per il nome lungo e il trattino lungo.

Le opzioni del nome lungo a due trattini sono state introdotte da GNU (dopo una deviazione che utilizza + come prefisso).

Vedi questo StackOverflow per una discussione sull'ampia varietà di noti sistemi di gestione degli argomenti della riga di comando - ci sono molti. ( Poiché questo è stato scritto, i poteri-in-essere hanno deciso che la domanda SO 367309 non era adatta per SO. Ho trasferito la risposta a un'altra domanda, Qual è la sintassi generale di un comando shell Unix? . )

Potresti estendere l'elenco di tecniche per coprire git (e un certo numero di altri sistemi) in cui ottieni una struttura del tipo:

  • basecommand [ opzioni globali ] subcommand [ opzioni di sottocomando ] [nome ...]

Potrebbero esserci molti sottocomandi, ognuno con il proprio lessico di opzioni.

Naturalmente, Windows utilizza la barra (utilizzata) " / " per indicare le opzioni anziché il trattino " - ".

JCL (per z / OS e OS / 360 e sistemi intermedi) tende ad usare i parametri posizionali separati da virgole, ed è generalmente considerato non user-friendly o una buona interfaccia.

    
risposta data 22.04.2011 - 04:35
fonte
15

EDIT: È stato sottolineato che questo stile è un GNU-ism, e che gli Unix non-GNU tendono ad usare una sintassi a un solo trattino (in particolare, le varianti OS X e BSD) .

Nonostante sia lo stato GNU-ism, molti programmi in stile Unix appena scritti usano questo stile:

  • --long-option per nomi di opzioni lunghe,
  • -s per le opzioni brevi (carattere singolo),
  • -abc per più opzioni brevi senza argomenti (un carattere per opzione).
  • Opzioni con argomenti:
    • --long arg o --long=arg per le opzioni lunghe,
    • -s arg , -sarg o (opzionalmente) -s=arg per opzioni brevi. Questo può essere combinato con altre opzioni brevi, purché solo l'ultimo abbia un argomento.
  • La stessa opzione "semantica" può avere diversi alias, più comunemente uno breve (più veloce da digitare) uno e uno lungo (più facile da ricordare).

Chiunque abbia usato una shell Linux per un certo periodo di tempo dovrebbe avere familiarità con questo stile 1 , quindi ha il principio della sorpresa minima dalla sua parte. Anche il raggruppamento di più opzioni brevi senza essere ambigue con le opzioni lunghe è bello.

1 Per esempio, alcuni dei programmi che usano questo stile (sulla mia macchina Linux): ls , grep , man , sed , bash , ecc. ( EDIT: questi sono apparentemente GNU-isms però, le macchine BSD e OS X non usano questo stile)

Ci sono diverse librerie che possono occuparsi di analizzare ciò per te (il più noto è L'implementazione di GNU di getopt ), che richiede solo che tu specifichi quali opzioni lunghe e brevi esistono, se prendono un argomento e cosa fare quando viene trovata un'opzione. (E naturalmente, che cosa fare per gli argomenti posizionali, cioè quelli che non iniziano con - e non sono argomenti alle opzioni precedenti)

find è un programma molto vecchio (o forse più probabile: una versione riscritta di un programma molto vecchio) che non può essere facilmente modificato per utilizzare una nuova sintassi della riga di comando. Troppi script si interromperanno e troppi utenti abituati alla vecchia sintassi si lamenterebbero. javac è stato probabilmente influenzato da gcc e amici, che similmente seguono una vecchia sintassi per motivi storici.

    
risposta data 22.04.2011 - 00:19
fonte
7
  • L'argomento con dash-dash ( --long-arg ) è una convenzione GNU (vedi il loro getopt implementazione).
  • I comandi POSIX non usano mai argomenti double dash. Questo vale per la maggior parte delle varianti di Unix (Mac OS X, BSD) eccetto Linux che usa GNU di default.

Per il tuo progetto Java, potresti voler controllare GNU getopt per Java o CLI di Apache . Supportano entrambe le convenzioni.

Una terza opzione è quella di utilizzare gli argomenti di Java VM e consentire al runtime di analizzarli per te:

 $ java -Dcolor=blue

E poi, nel codice:

 System.getProperty("color");

Personalmente, utilizzerei l'idioma -D e avvolgere l'incantesimo Java in uno script di shell che gestisce l'analisi della riga di comando, incluso il controllo del classpath, ecc. Ciò rende anche più facile per gli utenti nativi eseguire il programma Java.

    
risposta data 22.04.2011 - 12:58
fonte
1

Dipende. Personalmente preferisco lo stile POSIX, ma nel tuo caso probabilmente punterei alla coerenza con l'ambiente in cui verrà utilizzato il tuo strumento. Questo significa usare la convenzione Java per i JAR (a meno che tu non abbia in programma uno script wrapper che lo faccia apparire come un tipico comando Unix).

    
risposta data 22.04.2011 - 00:15
fonte

Leggi altre domande sui tag