GNU/Linux >> Tutoriales Linux >  >> Linux

Pasar opciones a un programa:¿cuál es la convención para un guión frente a dos?

El más común es GNU getopt estilo, con un guión para opciones cortas y dos guiones para opciones largas.

  • Inicialmente, los programas de Unix aceptaban opciones de una sola letra precedidas por un solo guión y se incluían opcionalmente:

    ls -laF
    
    ls -l -a -F
    

    Los dos comandos anteriores son iguales.

    Cuando una opción toma un valor, anula la agrupación:En gpg -aofoo.gpg , -a y -o son opciones y foo.gpg es el valor dado a -o .

  • La mayoría de ellos lo hicieron, de todos modos.

    tar cvzf es una vista común. Las versiones actuales aceptan tar -cvzf también, y dependiendo de si agrega el guión, los argumentos se interpretarán de formas muy diferentes. Por ejemplo, estos dos significan lo mismo (tenga en cuenta que las opciones sin guiones no inmediatamente antes de su valor):

    tar -xf file.tgz -vzO /etc/passwd /var/backups
    
    tar xfvzO file.tgz /etc/passwd /var/backups
    

    BSD ps siempre usa -; SysV ps nunca lo hace. La versión de Linux acepta ambas versiones y cambia su comportamiento dependiendo de si una opción fue prefijada con un guión. (A diferencia del ejemplo tar anterior, ps cambia la opción significados también.)

  • Los programas X11 usaban opciones largas precedidas por un solo guión o, a veces, un signo más:

    xterm -class FooTerm +vb -u8
    

    Esto establece las opciones class y u8 y desarmar el vb opción.

    El estilo X11 es incompatible con la agrupación de opciones.

  • Posteriormente, se agregaron opciones largas a GNU getopt() de una forma que sea compatible con las opciones de una letra.

    gpg -se --no-armor --output=signed.gpg
    

    Esto establece -s , -e y --no-armor (que es opuesto a --armor ).

    Por lo general, --output=signed.gpg y --output signed.gpg son equivalentes. (Pero no siempre, por ejemplo, curl no acepta lo primero, solo lo segundo).

    (Si no recuerdo mal, las opciones largas usaban + como el prefijo antes de que se cambiara a -- .)

  • La especificación POSIX tiene una sección Sintaxis de argumentos de utilidad, que describe las opciones de un carácter.

La mayoría de los programas de Windows utilizan sus propios analizadores, lo que vuelve locos a los usuarios.

  • Algunos requieren /a /b /c , otros permiten estilo VMS /a/b/c , otros prefieren /abc estilo Unix .
  • La mayoría usa / como prefijo, algunos también aceptan - , otros aceptan solo - .
  • Los valores se pueden dar como /foo bar , /foo=bar , /foo:bar .
  • Por lo general, los espacios pueden ser /quoted "like this" , pero algunos programas toman el " como un carácter literal. (Esta es una desventaja de dejar que el programa haga su propia división de palabras; en Unix esto lo maneja el shell).
  • Los programas multiplataforma pueden usar una implementación de getopt .

Generalmente, el primero se encuentra en programas más antiguos que están demasiado arraigados para cambiar. Ese tipo de opciones largas son incompatibles con el estándar getopt() función.

El segundo estilo fue introducido por GNU getopt_long() y cumple con los estándares existentes que esperan que el primer estilo incluya opciones cortas (es decir, -orange se espera que signifique -o -r -a -n -g -e ). Se prefiere mucho este estilo de opción larga.


Linux
  1. Enpass:la alternativa de contraseña perfecta y gratuita

  2. ¿Cuál es la contraseña raíz predeterminada para MySQL 5.7?

  3. ¿Cuál es el equivalente al comando de archivo de Linux para Windows?

  4. ¿Cuál es la identificación de partición/tipo de sistema de archivos para UDF?

  5. ¿Qué puede hacer que pasar init=/path/to/program al kernel no inicie el programa como init?

¿Cuál es la mejor distribución de Linux para principiantes?

Crontab escrito accidentalmente con solo el guión?

Los 40 ejemplos de comandos Go para aspirantes a desarrolladores de Golang

¿Qué constituye un 'campo' para el comando de corte?

¿Cuál es la diferencia entre las opciones -g y -G en useradd?

¿Cuál es el archivo predeterminado para `hostname`?