¿Cuál es la diferencia entre un guión y dos guiones para los parámetros del símbolo del sistema?

65

Me preguntaba por qué algunos programas requieren que sus parámetros de símbolo del sistema tengan dos guiones delante, mientras que algunos (la mayoría) solo requieren un guión delante.

Por ejemplo, la mayoría de los programas se ven así: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

Mientras que algunos programas se ven así: xmllint --valid toc.xml --noout

¿Cuál es la razón por la que algunos requieren dos guiones en lugar de uno? ¿No tiene sentido que todos se apeguen a un estándar (es decir, un solo guión servirá)?

Pacerier
fuente
10
> ¿No tiene sentido que todos se adhieran a un estándar ? Sí. ¿Todos los programadores se apegan a los estándares y mantienen la consistencia? No. Muchos programadores ni siquiera pueden mantener la coherencia dentro de sus programas :) Dicho esto, el consenso sería usar un guión solo para las opciones de una letra y dos guiones para todo lo que en realidad son palabras, por ejemplo, -ivs --inputo -n --dry-run.
slhck
1
@slhck Hey, gracias por la ayuda =) Por esa convención entonces, ¿significa que -dtdrealmente debería haber sido --dtd? Efectivamente, lo que me preguntaba es ¿qué significa el guión (y el guión doble) tratando de significar?
Pacerier
66
Para puntos de bonificación: los programas que cumplan con los estándares de Gnu --long-optionstambién aceptarán cualquier abreviatura única. Entonces, para un programa con opciones --file-iny --file-out, puede usar --file-o=fooo --file-i=foo, que puede ahorrar algo de escritura --very-long-optional-parameters.
BRPocock
GNU llegó junto con su convención de utilizar dos guiones para las opciones de "largos", que resulta que también lo prefiero, pero muchas utilidades mayores, como las que se incluye con el sistema X Window, así como ImageMagick ( por ejemplo , convert, mogrify) tienen "largo" opciones usando solo un guión. Por ejemplo: xterm -fn 6x10 -geometry 80x24+30+200. Las abreviaturas son compatibles, siempre que sean distintas ( por ejemplo , -go -geompara -geometry). Ver X (7) para otros ejemplos.
TheDudeAbides

Respuestas:

18

Solo hazlo ls --help y mira las opciones; debería ser obvio para ti.

No tiene nada que ver con los parámetros en absoluto. Muchas opciones tienen una forma corta y una forma larga, y muchas tienen una y no la otra.

Y también, con respecto a los parámetros, es simplemente que, en la forma larga, cuando toman un parámetro, parece que siempre es igual. Pero, obviamente, los cortos pueden tomar los mismos parámetros; solo que no usan iguales.

Aquí hay un extracto de ls --help( man lsda información equivalente). Observe cómo algunos tienen una forma larga y sin una forma corta ( --author, --block-size), algunos tienen una forma corta y sin una forma larga ( -c, -f, -g), y algunos tienen tanto una forma larga y una forma corta ( -A/ --almost-all, -b/ --escape).

 -a, --all                  do not ignore entries starting with .
 -A, --almost-all           do not list implied . and ..
     --author               with -l, print the author of each file
 -b, --escape               print octal escapes for nongraphic characters
     --block-size=SIZE      use SIZE-byte blocks
 -B, --ignore-backups       do not list implied entries ending with ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be `never', `always', or `auto'
barlop
fuente
44
¿Cómo hacemos un ls --helpen Windows?
Pacerier
1
@Pacerier No hay lsen Windows. El comando equivalente sería dir /?. Está utilizando un software multiplataforma que viola las convenciones habituales de Windows, consulte mi respuesta.
Daniel Beck
@Pacerier No está integrado, pero descárguelo de terceros, Gnuwin32 lo descarga (google gnuwin32). hay un montón de paquetes dentro de gnuwin32 cada uno con comandos, descargue el paquete coreutils, que tiene muchos comandos comunes.
barlop
Hay opciones largas sin opciones cortas en su ls --helpextracto. Ver --authory --block-size.
Dan
Para responder la pregunta en el comentario original de @ Pacerier: La forma más común en que los sistemas Windows modernos obtienen el lscomando es a través de GIT . El shell GIT bash o la ventana CMD con GIT bin en la RUTA tendrán ls.
yzorg
34

No hay un estándar generalizado. Hay cierta coherencia, por ejemplo, en los programas GNU, pero debe verificar la documentación de cada programa.

Citando Wikipedia , el énfasis es mío:

En sistemas tipo Unix, el guión ASCII menos se usa comúnmente para especificar opciones. El carácter suele ir seguido de una o más letras . Un argumento que es un solo guión, menos por sí mismo sin letras, generalmente especifica que un programa debe manejar los datos que provienen de la entrada estándar o enviar datos a la salida estándar. Se usan dos guiones – menos caracteres (-) en algunos programas para especificar "opciones largas" donde se usan nombres de opciones más descriptivos . Esta es una característica común del software GNU.

Por lo general, los guiones indican un argumento predefinido. Creo que se usa para diferenciarlos de, por ejemplo, nombres de archivos u otras etiquetas que podría usar como argumentos. Sin embargo, ese no es siempre el caso (ver más abajo).


A menudo encontrará el mismo argumento disponible como opción corta y larga, como por ejemplo en ls .

Algunos programas usan un solo guión para las opciones de un carácter y dos guiones para las opciones de varios caracteres, pero no todos (GNU me findviene a la mente). Algunos programas tienen guiones opcionales o los omiten por completo ( taro BSD me psviene a la mente).

A veces, las opciones largas ( --foo) requieren argumentos, mientras que las opciones cortas ( -f) no (o al menos implican un argumento predeterminado específico).

Las opciones cortas (por ejemplo cut -d ' ') pueden tener argumentos, mientras que las opciones largas (por ejemplo ls --all) no necesariamente las tienen.

Para establecer un comportamiento particular de un programa, a veces necesita usar una opción corta, para otros necesita usar una opción larga, y para algunos tiene una opción.

En una nota relacionada, algunos programas no pueden manejar espacios en blanco entre una opción y su argumento , mientras que otros no.

Como escribí al principio, simplemente no hay un comportamiento común o estándar. A menudo, puede rastrear un comportamiento similar a la misma biblioteca utilizada para el análisis de argumentos, pero probablemente no desee leer las fuentes para descubrir esto.

Realmente no se puede inferir la sintaxis de argumento de un programa a partir de la de otro.


Si también considera Windows, empeora aún más: mientras que la línea de comandos de Windows utiliza tradicionalmente /f(al menos la mayoría de las veces, caracteres individuales) para las opciones, con :el separador entre las opciones y su valor (ver, por ejemplo, aquí ); Las utilidades multiplataforma están muy extendidas (como las que menciona) y traen consigo la sintaxis de guiones más común para los argumentos, con todas las inconsistencias mencionadas anteriormente.

Daniel Beck
fuente
2
Cabe señalar que las bibliotecas estándar de GNU proporcionan la funcionalidad de mapear las opciones de una menos una letra, dos menos varias letras, por lo que todos los nuevos programas GNU y la mayoría del nuevo software libre en general utilizan esta notación (por ejemplo: f, -f foo, --file, --file foo, --file = foo, --fil = foo, --fi = foo); retrocesos tales como tar, ps, findy como tenía su sintaxis de línea de comandos POSIX establecido por esta norma antes había gelificado completamente. En un sistema Gnu / Linux, es una apuesta razonablemente segura que al menos --help(casi) siempre será compatible, así como man <command>oinfo <command>
BRPocock
¿El estándar GNU dice que no debería tener una forma corta sin una forma larga y no debería tener una forma larga sin una forma corta?
barlop el
+1 por ser la respuesta más completa, incluida la mención de GNU findque no sigue la "convención GNU" para opciones largas (probablemente por razones de cumplimiento POSIX, como señaló @BRPocock). Volvería a hacer +1 si pudiera, por mencionar los "interruptores" de la línea de comandos de DOS / Windows, ya que la pregunta del OP de alguna manera fue etiquetada como "ventanas", y esa convención debería mencionarse para completar.
TheDudeAbides
7

Esta es una convención que proviene de * nix. El guión doble precede a las opciones cuando se escriben en su totalidad , mientras que el guión simple precede a las opciones cuando se escriben en forma abreviada . Por ejemplo ls --all --l, se puede acortar a ls -al. Como se ve, no todas las opciones tienen sus equivalentes de letras únicas, aunque las más usadas suelen tenerlas.

Si la opción toma un argumento realmente no hace la diferencia, puede tomarlos o no tomarlos, independientemente de la forma en que ingrese la opción.

Cuando se escriben para un solo uso, en realidad no importa, pero cuando se escriben comandos, por ejemplo, en archivos .alias, es costumbre usar el formulario completo. Puramente por la facilidad de lectura para la próxima persona.

Torre
fuente
Hola, gracias por la ayuda, por cierto, ¿hay alguna razón por la que escribes unix como * nix?
Pacerier
2
@Pacerier: Unix es un nombre comercial. Al escribir * nix, en realidad me refiero a todos los sistemas Unix y similares, que a todos los efectos prácticos son los mismos. Pero sobre todo, es una fuerza de hábito ...
Rook
2
@Pacerier * nix puede referirse a Linux o Unix. No estoy totalmente seguro de esto porque hace un tiempo que lo investigué, pero técnicamente, si recuerdo, BSD es de la familia Unix. Linux técnicamente no es ... y tampoco lo es FreeBSD. Pero decir * nix incluiría unix / bsd, y cualquier cosa similar, por ejemplo, linux y freebsd.
barlop
2
+1 por mencionar la combinación de comandos abreviados. Esa es la verdadera razón por la que hay dos estilos.
Ryan_S
3

Estas son sintaxis convencionales de UNIX,

un argumento del programa toma un guión ("-") seguido de una sola letra cuando es una opción simple (por ejemplo: -v ) y dos guiones ("-") cuando la opción toma argumentos (por ejemplo: --file toc.xml o --file = toc.xml )

sin impacto en la funcionalidad del programa.


fuente
3
Además, en muchos casos con opciones de una sola letra después de un solo guión, puede agrupar las letras. Por ejemplo, "ls -al" es lo mismo que "ls -a -l". Las opciones de doble guión no se pueden combinar de esta manera. Las opciones de una sola letra son un estándar anterior, pero en la actualidad muchos comandos tomarán ambos tipos. Por ejemplo, "ls --todos" es lo mismo que "ls -a".
Randy Orrison
3
En realidad, otra corrección. Las opciones de una letra de un solo guión pueden tomar un parámetro, pero generalmente no está vinculado con un signo igual. Por ejemplo, "tail -n 50" muestra las últimas 50 líneas de un archivo, equivalente a "tail --lines = 50".
Randy Orrison
Por esta convención, ¿significa que --noout(en la pregunta anterior) realmente debería haberse escrito -nooutya que no tiene argumentos ?
Pacerier
1
Lo que se dice en esta respuesta sobre los parámetros es totalmente incorrecto. La primera oración es obvia. La última oración es obvia. Y el párrafo en el medio que debería responder la pregunta, está totalmente equivocado.
barlop
@RandyOrrison cuando una sola letra nunca he visto un signo igual ... y para elaborar su punto, a menudo toman parámetros ... wget -w 10 head -n 3 cut -b 2 ¿Y mira Ping? !! Las cargas toman parámetros. Esta respuesta es terrible
barlop
3

el guión simple es implementado por getopt y es la función estándar posix, el guión doble en getopt_long y es un estándar gnu.

Tradicionalmente, un solo guión proporciona una opción de carácter único como esta:

-A o -V, etc., pero no tiene por qué limitarse a eso. por ejemplo, -Wall for gcc activa todas las advertencias del compilador para el comando compilador gcc.

los argumentos de doble guión tienden a ser más detallados y, a menudo, toman un parámetro proporcionado como --max-count = NUM. Sin embargo, --version no tiene igual.

En términos generales, no hay reglas o estándares definidos sobre cómo deben especificarse los argumentos del programa, solo un montón de tradiciones. Sin embargo, si se utilizan las funciones de análisis de la línea de comandos getopt y getopt_long, los parámetros generalmente deben seguir el estándar, ya que las funciones de la biblioteca imponen una determinada forma de hacerlo.

Matt H
fuente