Estilo de opciones de línea de comandos - POSIX o qué?

14

En algún lugar vi una perorata contra java / javac supuestamente usando una mezcla de estilo de Windows y Unix como

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

En mi humilde opinión, no es una mezcla, es igual que find también funciona, ¿no es así? AFAIK, según POSIX, la sintaxis debe ser como

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

y -abcdef significarían especificar 6 opciones cortas a la vez. Me pregunto qué versión lleva, en general, a menos escritura y menos errores.

Estoy escribiendo una pequeña utilidad en Java y en ningún caso voy a usar el estilo de Windows /a /b ya que estoy interesado principalmente en Unix. ¿Qué estilo debo elegir?

    
pregunta maaartinus 21.04.2011 - 22:44

4 respuestas

19

Puede encontrar las convenciones de argumento POSIX en el capítulo Convenciones de utilidad . El estilo POSIX consiste en opciones con un solo guión seguido de una sola letra que indica la opción, con el valor del argumento separado de la opción por un espacio.

Hay excepciones a las reglas, por ejemplo, find , pero se deben a los precedentes históricos de Unix.

X Windows (X11) usa find , como las opciones de un solo guión y nombre largo.

Las opciones de nombre largo de doble guión fueron iniciadas por GNU (después de un desvío usando + como prefijo).

Vea esto StackOverflow para una discusión de la amplia variedad de sistemas conocidos de manejo de argumentos de línea de comando - hay muchos. ( Desde que se escribió, los poderes que se decidieron la pregunta SO 367309 no era una buena opción para SO. He transferido la respuesta a otra pregunta, ¿Cuál es la sintaxis general de un comando de shell de Unix? . )

Podría ampliar la lista de técnicas para cubrir git (y varios otros sistemas) donde obtiene una estructura como:

  • basecommand [ opciones globales ] subcommand [ opciones de subcomandos ] [nombre ...]

Puede haber muchos subcomandos, cada uno con su propio léxico de opciones.

Por supuesto, Windows usa (usa) la barra diagonal ' / ' para indicar las opciones en lugar del guión ' - '.

JCL (para z / OS, y OS / 360, y sistemas intermedios) tiende a usar parámetros posicionales separados por comas, y generalmente se considera que no es fácil de usar o una buena interfaz.

    
respondido por el Jonathan Leffler 22.04.2011 - 04:35
15

EDIT: se ha señalado que este estilo es un GNU-ism, y que los Unixes no basados en GNU tienden a usar una sintaxis de un solo guión (en particular, las variantes de OS X y BSD) .

A pesar de su estado GNU-ism, muchos programas de estilo Unix recién escritos usan este estilo:

  • --long-option para nombres de opción largos,
  • -s para opciones cortas (un carácter),
  • -abc para varias opciones cortas sin argumentos (un carácter por opción).
  • Opciones con argumentos:
    • --long arg o --long=arg para opciones largas,
    • -s arg , -sarg u (opcionalmente) -s=arg para opciones cortas. Esto se puede combinar con otras opciones cortas, siempre que only la última tenga un argumento.
  • La misma opción "semántica" puede tener varios alias, generalmente uno corto (más rápido de escribir) y uno largo (más fácil de recordar).

Cualquier persona que haya usado un shell de Linux durante un período de tiempo debe estar familiarizado con este estilo 1 , por lo que tiene el principio de menos sorpresas. También es bueno permitir la agrupación de múltiples opciones cortas sin ser ambiguo con opciones largas.

1 Por ejemplo, algunos de los programas que usan este estilo (en mi máquina Linux): ls , grep , man , sed , bash , etc. ( EDIT: estos son aparentemente GNU-ismos, aunque las máquinas BSD y OS X no usan este estilo)

Hay varias bibliotecas que pueden encargarse de analizar esto por usted (las más conocidas son Implementación de GNU de getopt ), solo necesita que especifique qué opciones largas y cortas existen, ya sea que tomen un argumento, y qué hacer cuando se encuentra una opción. (Y, por supuesto, qué hacer para los argumentos posicionales, es decir, los que no comienzan con - y no son argumentos de las opciones anteriores)

find es un programa muy antiguo (o quizás más probable: una versión reescrita de un programa muy antiguo) que no se puede cambiar fácilmente para usar una nueva sintaxis de línea de comandos. Demasiados scripts se romperían, y muchos usuarios acostumbrados a la sintaxis anterior se quejarían. javac probablemente fue influenciado por gcc y amigos, que también siguen una sintaxis antigua por razones históricas.

    
respondido por el Frits 22.04.2011 - 00:19
7
  • El argumento con guión-guión ( --long-arg ) es una convención de GNU (consulte su implementación de getopt ).
  • Los comandos POSIX nunca usan argumentos de doble guión. Esto se aplica a la mayoría de las variantes de Unix (Mac OS X, BSD) excepto a Linux que usa GNU de forma predeterminada.

Para su proyecto Java, puede consultar GNU getopt para Java o CLI de Apache . Apoyan ambas convenciones.

Una tercera opción es usar los argumentos de Java VM y dejar que el tiempo de ejecución los analice por usted:

 $ java -Dcolor=blue

Y luego, en código:

 System.getProperty("color");

Personalmente, usaría el lenguaje -D y envolvería el conjuro de Java en un script de shell que controla el análisis de la línea de comandos, incluida la comprobación de la ruta de clase, etc. Esto también facilita que los usuarios nativos ejecuten su programa Java. / p>     

respondido por el Martin Wickman 22.04.2011 - 12:58
1

Depende. Personalmente prefiero el estilo POSIX, pero en su caso, probablemente buscaría la coherencia con el entorno en el que se va a utilizar su herramienta. Esto significa usar la convención de Java para JARs (a menos que planee tener un script de envoltura que lo haga ver como un comando típico de Unix).

    
respondido por el Adam Byrtek 22.04.2011 - 00:15

Lea otras preguntas en las etiquetas

Comentarios Recientes

Por defecto, virtualenv solo le ofrece un montón de soluciones y opciones para que pueda crear y administrar su entorno virtual. Algunos usuarios prefieren configurar todos sus entornos virtuales a mano utilizando la línea de comandos, pero eso no es realmente recomendable. En su lugar, tenga a su alcance una increíble variedad de opciones interactivas, importantes como: - DISPLAY =: xresconv - OPENPROCESSOR = * - MINIVISIBLE_PATH = * - LOG_ALLOWED = YES - LOG_FORCE_EXECUTABLE = YES - COPY_COMMAND = gzip - OPENSSL_POISONUX__PECON... Lee mas