¿Por qué usar un guión superflous (-) para pasar banderas de opciones a tar?


35

Para crear un archivo tar para un directorio, el tarcomando con compress, verbosey filelas opciones se pueden escribir así:

$ tar -cvf my.tar my_directory/

Pero también funciona hacerlo de esta manera:

 $ tar cvf my.tar my_directory/

Es decir, sin el guión (-) que precede a las opciones. ¿Por qué pasarías un guión (-) a la lista de opciones?


Respuestas:


43

Existen varios patrones diferentes para las opciones que se han usado históricamente en aplicaciones UNIX. Varios viejos, como el alquitrán , usan un esquema posicional:

argumentos de opciones de comando

como por ejemplo usos de alquitrán

tar * something * f "archivo operado en" * "rutas de archivos para manipular" *

En un primer intento de evitar la confusión, tar y algunos otros programas con el viejo estilo de argumentos de banderas permitieron delimitar las banderas con guiones, pero la mayoría de nosotros los viejos simplemente ignoramos eso.

Algunos otros comandos tienen una sintaxis de línea de comandos más complicada, como dd (1) que usa banderas, signos iguales, nombres de ruta, argumentos y una perdiz en un peral, todo con un abandono salvaje.

En BSD y versiones posteriores de Unix, esto había convergido más o menos a banderas de un solo carácter marcadas con '-', pero esto comenzó a presentar un par de problemas:

  • las banderas pueden ser difíciles de recordar
  • a veces realmente querías usar un nombre con '-'
  • y especialmente con las herramientas GNU, comenzaron a existir limitaciones impuestas por el número de posibles indicadores. Entonces las herramientas GNU agregaron opciones largas de GNU como --output.

Entonces Sun decidió que el '-' extra era redundante y comenzó a usar banderas de estilo largo con '-'s individuales.

Y así es como llegó a ser el desastre que es ahora.


99
"y una perdiz en un peral" Mejor que mi intento seco. Tú ganas.
dmckee

1
Buen contexto histórico.

1
Noté que muchos programas X (incluido, por ejemplo, X, de Xorg), usan banderas de estilo largo con una sola -. ¿Eso es del sol?
mattdm

1
¿Cuál es el significado de 'perdiz en un peral'? (¿Puedo tener ningún vínculo útil y fácil de entender?)
plhn

1
@plhn Idiom. Un villancico tradicional inglés "Los doce días de Navidad" enumera un montón de regalos extravagantes, que terminan con "una perdiz en un peral". Sugiere una larga lista extravagante.
Charlie Martin

8

Puede dar opciones tar en la forma estándar de Unix tar -c -f foo -v -B file1 file2 file3donde necesita el guión para diferenciar entre opciones y parámetros o los nombres de archivo al final de la línea de comando. O puede juntar todas las opciones en el primer argumento, en cuyo caso el guión es opcional.

Luego está ps, donde usas los guiones si estás usando las opciones SysV-ish, y los dejas afuera si estás usando las opciones BSD-ish, solo para hacer las cosas más confusas.

Y ni siquiera hablemos de eso find.


2

El guión se usa para desambiguar entre los nombres y valores de los parámetros de una opción. Supongo que es más una convención estándar.


1
Iba a agregar la best-practiceetiqueta porque pensé que podría deberse a eso.

1
@ Milktrader, es una pregunta difícil cuando se habla de las mejores prácticas. Seguir las convenciones estándar es, de hecho, la mejor práctica, pero no está claro si desea hacerlo en sus casos. Dependerá de su escenario. Si está pirateando algún comando rápido en el shell, probablemente no le interese mucho, pero si está escribiendo una biblioteca, es importante seguir convenciones bien establecidas porque no tiene control sobre cómo se usará esta biblioteca por los clientes En este caso, debe cubrir todos los casos posibles y la desambiguación entre los nombres y valores de las opciones es importante.

-1

Hay hasta cuatro convenciones para usar las opciones de línea de comandos de Unix:

  1. -o -p -t (guión antes de cada opción)
  2. -opt (guión antes de un conjunto de opciones)
  3. opt (sin guión antes de un conjunto de opciones)
  4. - opción larga (doble guión antes del nombre de una opción)

Por ejemplo:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz

1
¿Es esa convención solo aplicable al alquitrán? ¿Qué hay de ls? ls lrt no funcionará pero ls -lrt / ls -l -r -t funcionará. ¿Porque?
Shashank Vyas

Las cuatro convenciones deberían funcionar para todos los comandos.
jonasjacek

2
No, no lo hacen. El otro día probé rm rf <nombre de archivo>, que tampoco funciona.
Shashank Vyas

-2

Con el signo inicial de menos / guión (-) debe mantener las opciones en el orden preciso. Sin menos el orden de su opción puede cambiar.

Por ejemplo:

# tar -xvf yourfile.tar
# tar vxf yourfile.tar

Esta respuesta es la mitad correcta, pero AFAIK es solo que las banderas como fesa toman un argumento cuyo orden importa. Ver unix.stackexchange.com/a/239120/3169
Mikel
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.