Esiste un formato "standard" per il testo di aiuto della riga di comando / shell?


239

In caso contrario, esiste uno standard di fatto? Fondamentalmente sto scrivendo un testo di aiuto dalla riga di comando in questo modo:

usage: app_name [options] required_input required_input2
  options:
    -a, --argument     Does something
    -b required     Does something with "required"
    -c, --command required     Something else
    -d [optlistitem1 optlistitem 2 ... ]     Something with list

L'ho fatto praticamente leggendo il testo di aiuto di vari strumenti, ma esiste un elenco di linee guida o qualcosa del genere? Ad esempio, utilizzo parentesi quadre o parentesi? Come usare la spaziatura? Cosa succede se l'argomento è un elenco? Grazie!


8
Penso che GNU abbia alcuni suggerimenti. Vorrei vedere cosa stanno facendo la maggior parte delle utility GNU.
Basile Starynkevitch,

1
@DanielPryden Penso che la risposta a questa domanda sia un po 'fuorviante. Fornisce collegamenti che spiegano quali switch dovrebbero essere accettati e non come --helpdovrebbe apparire l'output di . Ma entrambe le domande sono un buon candidato per una fusione.
pm

@pmr: sono d'accordo - forse un mod può unire le domande per noi.
Daniel Pryden,

2
Vorrei vedere cosa stanno facendo la maggior parte dei programmi di utilità GNU e farlo diversamente.
Yakov Galka,

Risposte:


160

In genere, l'output della guida dovrebbe includere:

  • Descrizione di ciò che fa l'app
  • Sintassi d'uso, che:
    • Utilizza [options]per indicare dove vanno le opzioni
    • arg_name per un arg richiesto, singolare
    • [arg_name] per un arg opzionale, singolare
    • arg_name... per un argomento richiesto di cui possono essercene molti (questo è raro)
    • [arg_name...] per un arg per il quale è possibile fornire qualsiasi numero
    • si noti che arg_namedovrebbe essere un nome descrittivo, abbreviato, in minuscolo, caso di serpente
  • Un elenco di opzioni ben formattate, ognuna:
    • avere una breve descrizione
    • mostrando il valore predefinito, se ce n'è uno
    • mostrando i possibili valori, se applicabile
    • Si noti che se un'opzione può accettare una forma breve (ad esempio -l) o una forma lunga (ad esempio --list), includerli insieme sulla stessa riga, poiché le loro descrizioni saranno le stesse
  • Breve indicatore della posizione dei file di configurazione o delle variabili di ambiente che potrebbero essere la fonte degli argomenti della riga di comando, ad es GREP_OPTS
  • Se è presente una pagina man, indicare come tale, altrimenti un breve indicatore di dove è possibile trovare un aiuto più dettagliato

Si noti inoltre che è una buona forma accettare entrambi -he --helpattivare questo messaggio e che è necessario mostrare questo messaggio se l'utente confonde la sintassi della riga di comando, ad esempio omette un argomento richiesto.


3
E se avessi due forme di un singolo argomento richiesto? Ad esempio, un modo più standard di dire: usage: move (+|-)pixelscioè quando uno + o - è obbligatorio ? (So ​​di poter avere 2 linee di utilizzo ma mi piace l'idea di raddoppiarle con ogni nuovo argomento.) Riesci a pensare ad un esempio da uno strumento standard?
Alois Mahdal,

4
@AloisMahdal Io di solito vedere {a|b|c|...}in sezioni di aiuto per gli script di servizio SysV init / upstart, che richiedono un argomento singolare che è uno dei a, b, c, ecc, ad esempio, service sddmsenza un argomento sul mio sistema stampa fuori Usage: /etc/init.d/sddm {start|stop|status|restart|try-restart|force-reload}. Quindi la maggior parte delle persone probabilmente capirà usage: move {+|-}pixels}, soprattutto se viene fornito un esempio:example: move +5
Braden Best

@JorgeBucaran non dovrebbero uscire con lo stato 0 dovrebbero? Credo che uscire con lo stato 2 sia lo standard per i comandi shell non validi.
Inavda,

91

Dai un'occhiata a docopt . È uno standard formale per documentare (e analizzare automaticamente) gli argomenti della riga di comando.

Per esempio...

Usage:
  my_program command --option <argument>
  my_program [<optional-argument>]
  my_program --another-option=<with-argument>
  my_program (--either-that-option | <or-this-argument>)
  my_program <repeating-argument> <repeating-argument>...

46

Penso che non ci sia sintassi standard per l'utilizzo della riga di comando, ma la maggior parte usa questa convenzione:

Sintassi della riga di comando di Microsoft , IBM ha una sintassi della riga di comando simile


  • Text without brackets or braces

    Articoli che devi digitare come mostrato

  • <Text inside angle brackets>

    Segnaposto per il quale è necessario fornire un valore

  • [Text inside square brackets]

    Articoli opzionali

  • {Text inside braces}

    Set di articoli richiesti; scegline uno

  • Barra verticale {a|b}

    Separatore per articoli reciprocamente esclusivi; scegline uno

  • ellissi <file> …

    Articoli che possono essere ripetuti


16

Stiamo eseguendo Linux, un sistema operativo per lo più conforme a POSIX. Gli standard POSIX dovrebbero essere: Sintassi dell'argomento utility .

  • Un'opzione è un trattino seguito da un singolo carattere alfanumerico, in questo modo: -o.
  • Un'opzione può richiedere un argomento (che deve apparire immediatamente dopo l'opzione); per esempio, -o argumento -oargument.
  • Le opzioni che non richiedono argomenti possono essere raggruppate dopo un trattino, quindi, ad esempio, -lstè equivalente a -t -l -s.
  • Le opzioni possono apparire in qualsiasi ordine; quindi -lstequivale a -tls.
  • Le opzioni possono apparire più volte.
  • Le opzioni precedono altri argomenti di non -lstopzione : non opzione.
  • L' --argomento termina le opzioni.
  • L' -opzione viene in genere utilizzata per rappresentare uno dei flussi di input standard.

2
È comune che l'utilizzo in GNU / Linux non segua esattamente questo standard. Eseguire ad esempio, man aptitudeche emette questa (tra le altre cose): aptitude [<options>...] {add-user-tag | remove-user-tag} <tag> <packages>.... Contiene {e} per associare comandi obbligatori alternativi. Penso che (e) potrebbero essere usati per lo stesso come sono usati in docopt .
jarno

Questa risposta sarà molto meno utile se il link fornito scende. Forse potresti riassumere le parti importanti del documento collegato nella risposta stessa?
domsson,

11

Microsoft ha le proprie specifiche standard da riga di comando :

Questo documento è destinato agli sviluppatori di utility da riga di comando. Collettivamente, il nostro obiettivo è presentare un'esperienza utente coerente e compostabile dalla riga di comando. Un risultato che consente a un utente di apprendere un insieme di concetti di base (sintassi, denominazione, comportamenti, ecc.) E quindi di essere in grado di tradurre tale conoscenza in un grande insieme di comandi. Tali comandi dovrebbero essere in grado di generare flussi di dati standardizzati in un formato standardizzato per consentire una facile composizione senza l'onere di analizzare i flussi di testo di output. Questo documento è scritto per essere indipendente da qualsiasi implementazione specifica di una shell, set di utilità o tecnologie di creazione di comandi; tuttavia, l'Appendice J - L'uso di Windows Powershell per implementare Microsoft Command Line Standard mostra come l'uso di Windows PowerShell fornirà gratuitamente l'implementazione di molte di queste linee guida.


9
Microsoft ha un terribile aiuto da linea di comando per la maggior parte delle utility, tutto è così orribile che hanno costretto Powershell a nascondere la riga di comando "normale" sotto il tappeto.
Camilo Martin,

25
Non credo che la risposta debba essere sottoposta a downgrade solo perché ha un riferimento allo standard di Microsoft. "tutto è così orribile" è un'opinione soggettiva. Allo stesso modo si può dire che la riga di comando di UNIX è terribile e brutta, ma teniamo lontane tali opinioni ed essere professionisti.
Dima,

2
D'accordo, non è questo il motivo per cui questa risposta dovrebbe essere votata in downgrade. Se sottoposto a downgrade, dovrebbe essere perché a) la sezione del documento che è stata citata non risponde alla domanda attuale e b) il documento collegato non sembra pertinente. La domanda chiede se ci sono standard per "testo di aiuto" con una forte enfasi sulla sintassi utilizzata per comunicare i sinossi sull'uso dei comandi. Il documento non offre tale sintassi ma piuttosto come creare buone app da riga di comando in generale nell'ecosistema PowerShell (ad esempio, deve supportare -?,-Help , -Version, etc.). La risposta dell'IMO Steely Wing è più vicina al segno.
Mark G.

9

Lo standard di codifica GNU è un buon riferimento per cose come questa. Questa sezione tratta dell'output di --help. In questo caso non è molto specifico. Probabilmente non puoi sbagliare con la stampa di una tabella che mostra le opzioni brevi e lunghe e una descrizione sintetica. Cerca di ottenere la spaziatura tra tutti gli argomenti giusti per la leggibilità. Probabilmente vuoi fornire una manpagina (e possibilmente un infomanuale) affinché il tuo strumento fornisca una spiegazione più elaborata.


0

si, sei sulla strada giusta.

sì, le parentesi quadre sono il solito indicatore di articoli opzionali.

In genere, come è stato delineato, nella parte superiore è presente un riepilogo della riga di comando, seguito da dettagli, idealmente con esempi per ciascuna opzione. (Il tuo esempio mostra le righe tra ogni descrizione dell'opzione, ma suppongo che sia un problema di modifica e che il tuo programma reale produca elenchi di opzioni rientrate senza righe vuote tra queste. Questo sarebbe lo standard da seguire in ogni caso.)

Una tendenza più recente, (forse esiste una specifica POSIX che si rivolge a questo?), È l'eliminazione del sistema della pagina man per la documentazione e includendo tutte le informazioni che sarebbero in una pagina man come parte della program --help dell'output. Questo extra includerà descrizioni più lunghe, concetti spiegati, esempi di utilizzo, limitazioni e bug noti, come segnalare un bug e possibilmente una sezione "vedi anche" per i comandi correlati.

Spero che aiuti.


4
No no no Il comando dovrebbe avere una manpage che includa un riferimento completo e dettagliato dell'uso e -h|--helpdovrebbe essere solo un riferimento riassunto. Puoi anche includere una documentazione più completa (tutorial, ecc ...) in pagine HTML o informative. Ma la manpage dovrebbe essere lì!
ninjalj

Sono d'accordo con te, @ninjalj, ma come ho detto, "Una tendenza più recente", e con questo intendo i due sistemi che utilizzo, UWin e MinGW sono entrambi accompagnati da documentazione integrata. Penso che il documento incorporato abbia i suoi posti, specialmente per piccoli script a livello di utente, come quello che propone questo utente. Dovrebbe imparare nroff e .info? Ma è bello essere onesti, grazie per i tuoi commenti e buona fortuna a tutti.
shellter

Personalmente, quando scrivo someCommand --helpnella mia shell, tutto ciò di cui ho bisogno è un piccolo promemoria del preciso ordine in cui vanno gli argomenti, non un'enorme striscia di testo che riempie lo schermo, richiedendo che lo installi lesssolo per vederlo tutto. La manpage dovrebbe essere dove metti la lunga descrizione dettagliata, non il testo di aiuto.
AJMansfield,

secondo il creatore di docopt nella sua conferenza, afferma che POSIX ha una norma per questo.
v.

0

Seguirei progetti ufficiali come tar come esempio. Secondo me aiutare msg. deve essere il più semplice e descrittivo possibile. Anche gli esempi di utilizzo sono buoni. Non è necessario un "aiuto standard".


Per quanto riguarda tar... se qualcuno sta per fare un dio-tutto come tar, per favore rendi memorizzabili gli interruttori brevi e includi una sezione "esempio di utilizzo" nella --help. Il 90% delle volte che guardo le istruzioni di tar è per estrarre un semplice tar.gz.
Camilo Martin,

' Non è necessario un "aiuto standard". 'C'è qualche "reale necessità" per la maggior parte delle cose che usiamo? O sono lì solo per rendere le nostre vite molto più facili? Avere un modo concordato di rappresentare le opzioni è utile non solo per i lettori, ma anche, ad esempio, sarebbe utile costruire persone, ad esempio GUI, in grado di controllare le utility arbitrarie della riga di comando e che desiderano fornire controlli per l'impostazione delle loro opzioni. Probabilmente ci sono usi migliori che non ho ancora preso in considerazione.
underscore_d,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.