Existe um formato "padrão" para o texto de ajuda da linha de comando / shell?

239

Caso contrário, existe um padrão de fato? Basicamente, estou escrevendo um texto de ajuda da linha de comando, assim:

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

Eu fiz isso basicamente lendo apenas o texto de ajuda de várias ferramentas, mas há uma lista de diretrizes ou algo assim? Por exemplo, eu uso colchetes ou parênteses? Como usar espaçamento? E se o argumento for uma lista? Obrigado!

Yifan
fonte
8
Eu acho que o GNU tem algumas dicas. Eu examinaria o que a maioria dos utilitários GNU está fazendo.
Basile Starynkevitch 15/03/12
1
@DanielPryden Acho que a resposta nessa pergunta é um pouco enganadora. Ele fornece links que explicam quais opções devem ser aceitas e não a aparência da saída --help. Mas ambas as perguntas são um bom candidato para uma mesclagem.
Pmr
@pmr: Eu concordo - talvez um mod possa mesclar as perguntas para nós.
Daniel Pryden
2
Eu examinaria o que a maioria dos utilitários GNU está fazendo e o faria de outra maneira.
Yakov Galka

Respostas:

160

Normalmente, sua saída de ajuda deve incluir:

  • Descrição do que o aplicativo faz
  • Sintaxe de uso, que:
    • Usa [options]para indicar para onde as opções vão
    • arg_name para um argumento obrigatório e singular
    • [arg_name] para um argumento opcional e singular
    • arg_name... para um argumento exigido, do qual pode haver muitos (isso é raro)
    • [arg_name...] para um argumento para o qual qualquer número pode ser fornecido
    • note que arg_namedeve ser um nome curto e descritivo, em letras minúsculas
  • Uma lista de opções bem formatada, cada uma:
    • tendo uma breve descrição
    • mostrando o valor padrão, se houver um
    • mostrando os valores possíveis, se aplicável
    • Observe que, se uma opção puder aceitar um formulário curto (por exemplo -l) ou longo (por exemplo --list), inclua-os juntos na mesma linha, pois suas descrições serão as mesmas
  • Breve indicador da localização dos arquivos de configuração ou variáveis ​​de ambiente que podem ser a fonte dos argumentos da linha de comando, por exemplo GREP_OPTS
  • Se houver uma página de manual, indique como tal, caso contrário, um breve indicador de onde pode ser encontrada ajuda mais detalhada

Observe ainda que é uma boa forma aceitar ambos -he --helpacionar esta mensagem e que você deve mostrá-la se o usuário alterar a sintaxe da linha de comando, por exemplo, omite um argumento necessário.

davetron5000
fonte
3
E se eu tiver duas formas de um único argumento necessário? Por exemplo, maneira mais padrão de dizer: usage: move (+|-)pixelsou seja, quando um dos + ou - é obrigatório ? (Eu sei que posso ter duas linhas de uso, mas gosto da ideia de dobrá-las a cada novo argumento.) Você consegue pensar em um exemplo de uma ferramenta padrão?
Alois Mahdal
4
@AloisMahdal eu costumo ver {a|b|c|...}nas seções de ajuda para / scripts de serviços arrivista SysV Init, que exigem um argumento singular que é um dos a, b, c, etc. Por exemplo, service sddmsem um argumento no meu sistema imprime Usage: /etc/init.d/sddm {start|stop|status|restart|try-restart|force-reload}. Assim, a maioria das pessoas provavelmente entender usage: move {+|-}pixels}, especialmente se um exemplo é dado:example: move +5
Braden Melhor
@JorgeBucaran, eles não deveriam sair com o status 0, deveriam? Eu acredito que sair com o status 2 é o padrão para comandos shell inválidos.
Inavda 11/03/19
91

Dê uma olhada no docopt . É um padrão formal para documentar (e analisar automaticamente) argumentos da linha de comando.

Por exemplo...

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>...
Lily Finley
fonte
46

Eu acho que não há sintaxe padrão para o uso da linha de comando, mas a maioria usa esta convenção:

Sintaxe da linha de comando da Microsoft , a IBM possui sintaxe de linha de comando semelhante


  • Text without brackets or braces

    Itens que você deve digitar como mostrado

  • <Text inside angle brackets>

    Espaço reservado para o qual você deve fornecer um valor

  • [Text inside square brackets]

    Itens opcionais

  • {Text inside braces}

    Conjunto de itens necessários; escolha um

  • Barra vertical {a|b}

    Separador para itens mutuamente exclusivos; escolha um

  • Elipse <file> …

    Itens que podem ser repetidos

Asa de aço
fonte
16

Estamos executando o Linux, um sistema operacional principalmente compatível com POSIX. Os padrões POSIX devem ser: Sintaxe do argumento do utilitário .

  • Uma opção é um hífen seguido por um único caractere alfanumérico, como este: -o.
  • Uma opção pode exigir um argumento (que deve aparecer imediatamente após a opção); por exemplo, -o argumentou -oargument.
  • As opções que não exigem argumentos podem ser agrupadas após um hífen; portanto, por exemplo, -lsté equivalente a -t -l -s.
  • As opções podem aparecer em qualquer ordem; assim -lsté equivalente a -tls.
  • As opções podem aparecer várias vezes.
  • As opções precedem outros argumentos de não- -lstopção : não- opção.
  • O --argumento encerra as opções.
  • A -opção é normalmente usada para representar um dos fluxos de entrada padrão.
MotherDawg
fonte
2
É comum que o uso no GNU / Linux não siga exatamente esse padrão. Run por exemplo, man aptitudeque gera este (entre outras coisas): aptitude [<options>...] {add-user-tag | remove-user-tag} <tag> <packages>.... Ele contém {e} para vincular comandos obrigatórios alternativos. Eu acho que (e) poderia ser usado da mesma forma que são usados ​​no docopt .
Jarno
Esta resposta será muito menos útil se o link fornecido cair. Talvez você possa resumir as partes importantes do documento vinculado na própria resposta?
domsson 9/12/19
11

A Microsoft tem sua própria especificação Command Line Standard :

Este documento está focado nos desenvolvedores de utilitários de linha de comando. Coletivamente, nosso objetivo é apresentar uma experiência consistente e composível ao usuário da linha de comando. Conseguir isso permite que o usuário aprenda um conjunto principal de conceitos (sintaxe, nomeação, comportamentos etc.) e depois possa traduzir esse conhecimento para trabalhar com um grande conjunto de comandos. Esses comandos devem poder gerar fluxos de dados padronizados em um formato padronizado para permitir uma composição fácil, sem a necessidade de analisar fluxos de texto de saída. Este documento foi escrito para ser independente de qualquer implementação específica de um shell, conjunto de utilitários ou tecnologias de criação de comandos; no entanto, o Apêndice J - Usando o Windows Powershell para implementar o Microsoft Command Line Standard mostra como o uso do Windows PowerShell fornecerá a implementação de muitas dessas diretrizes gratuitamente.

Jared Harley
fonte
9
A Microsoft tem uma ajuda terrível da linha de comando para a maioria dos utilitários, tudo é tão terrível que eles fizeram o Powershell esconder a linha de comando "regular" debaixo do tapete.
Camilo Martin
25
Não acho que a resposta deva ser votada apenas porque tem uma referência ao padrão da Microsoft. "tudo é tão horrível" é uma opinião subjetiva. Da mesma maneira, pode-se dizer que a linha de comando do UNIX é horrível e feia, mas vamos manter essas opiniões afastadas e ser profissionais.
Dima
2
Concordado, não é por isso que esta resposta deve ser rebaixada. Se for diminuído, deve ser porque: a) a seção do documento que foi citada não responde à pergunta em questão eb) o documento vinculado não parece relevante. A pergunta pergunta se existem padrões para o "texto de ajuda", com forte ênfase na sintaxe usada para comunicar as sinopses do uso de comandos. O documento não ofertar tal sintaxe, mas sim como construir bons aplicativos de linha de comando em geral no ecossistema PowerShell (por exemplo, deve suportar -?, -Help, -Version, etc.). A resposta da IMO Steely Wing está mais próxima da marca.
Mark G.
9

O GNU Coding Standard é uma boa referência para coisas assim. Esta seção trata da saída de --help. Nesse caso, não é muito específico. Você provavelmente não pode dar errado ao imprimir uma tabela mostrando as opções curtas e longas e uma descrição sucinta. Tente acertar o espaçamento entre todos os argumentos para facilitar a leitura. Você provavelmente deseja fornecer uma manpágina (e possivelmente um infomanual) para sua ferramenta, para fornecer uma explicação mais elaborada.

pmr
fonte
0

sim, você está no caminho certo.

Sim, colchetes são o indicador usual para itens opcionais.

Normalmente, como você esboçou, há um resumo da linha de comando na parte superior, seguido por detalhes, idealmente com amostras para cada opção. (Seu exemplo mostra linhas entre cada descrição de opção, mas presumo que seja um problema de edição e que seu programa real produz listagens de opções recuadas sem linhas em branco no meio. Esse seria o padrão a ser seguido em qualquer caso.)

Uma tendência mais recente, (talvez exista uma especificação POSIX que resolva isso?), É a eliminação do sistema da página de manual para documentação e incluindo todas as informações que estariam em uma página de manual como parte da program --helpsaída. Este extra incluirá descrições mais longas, conceitos explicados, exemplos de uso, limitações e bugs conhecidos, como relatar um bug e, possivelmente, uma seção 'consulte também' para comandos relacionados.

Eu espero que isso ajude.

shellter
fonte
4
Não não não. O comando deve ter uma página de manual que inclua uma referência detalhada completa de uso e -h|--helpdeve ser apenas uma referência resumida. Você também pode incluir documentação mais abrangente (tutoriais, etc ...) em páginas HTML ou informações. Mas a página de manual deve estar lá!
Njalj 15/03/12
Eu concordo com você, @ninjalj, mas como eu disse: "Uma nova tendência", quero dizer com os dois sistemas que eu uso, UWin e MinGW, ambos com documentação incorporada. Eu acho que o documento incorporado tem seus lugares, especialmente para pequenos scripts em nível de usuário, como o que esse usuário está propondo. Ele deveria aprender nroff e .info? Mas é bom nos manter honestos, obrigado por seus comentários e boa sorte a todos.
shellter
Pessoalmente, quando digito someCommand --helpna minha concha, tudo o que preciso é de um pequeno lembrete da ordem exata em que os argumentos são inseridos, não uma faixa gigantesca de texto que preenche a tela, exigindo que eu a incline lessapenas para ver tudo. A página de manual deve estar onde você coloca a descrição detalhada longa, não o texto de ajuda.
precisa saber é o seguinte
de acordo com o criador do docopt em sua conferência, ele menciona que o POSIX tem uma norma para isso.
v.oddou 25/06
0

Eu seguiria projetos oficiais como o tar como exemplo. Na minha opinião ajuda msg. precisa ser o mais simples e descritivo possível. Exemplos de uso também são bons. Não há necessidade real de "ajuda padrão".

rluks
fonte
Em relação a tar... se alguém vai fazer uma utilidade divina como o tar, por favor, torne os interruptores curtos memoráveis ​​e inclua uma seção "exemplo de uso" no --help. Em 90% das vezes, olho para as instruções do tar, para extrair um simples tar.gz.
Camilo Martin #
' Não há necessidade real de "ajuda padrão". Existe alguma "necessidade real" para a maioria das coisas que usamos? Ou eles estão lá apenas para facilitar nossas vidas? Ter uma maneira combinada de representar opções é útil não apenas para os leitores, mas também, por exemplo, pessoas úteis construindo, por exemplo, GUIs que podem controlar utilitários de linha de comando arbitrários e desejam fornecer controles para definir suas opções. Provavelmente existem usos melhores que eu não considerei ainda.
Sublinhado #