alquitrán y sus letras clave: ¿es un error o una característica?

18

Me pregunto si preguntaré la diferencia de estos dos comandos (es decir, solo el orden de sus opciones es diferente):

  1. tar -zxvf foo.tar.gz
  2. tar -zfxv foo.tar.gz

El primero funcionó perfectamente pero el segundo dijo:

tar: You must specify one of the `-Acdtrux' or `--test-label'  options
Try `tar --help' or `tar --usage' for more information.

Y alquitrán con --test-labely -zfxvdijo:

tar (child): xv: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

¡Luego miré el manual de alquitrán y me di cuenta de que todos los ejemplos están usando el interruptor -fal final!

AFAICT no hay necesidad de esta restricción, ¿o sí? porque, en mi opinión, los interruptores deben estar libres de pedidos.

khikho
fuente
2
@schily su "corrección" a las líneas de comando oscureció el comando que realmente escribió. Un guión inicial cambia el comportamiento de GNU tar para usar un analizador de argumentos diferente. Al no usar guión (y, por lo tanto, el analizador de argumentos tradicional), el segundo comando habría funcionado.
Random832
La impresión delta del sistema web me dijo que usted o alguien antes agregó el -, así que lo eliminé nuevamente para que coincida con lo que el sistema me dijo que era del OP. Pero si tiene razón gtar option parsing, descubrió otra razón para no usar gtar.
schily
1
-fespera que siga el nombre del archivo. En su segunda versión, especificó -fxvque, para tar, significa que el nombre de archivo es "xv".
Rolf
1
Obligatorio XKCD .
Pavel

Respuestas:

11

Al mirar su mensaje de error, es obvio que no lo usó, tarsino más bien gtar.

En general, esto puede ayudar a comprender las cosas:

  • tarnormalmente siempre necesita un argumento de archivo. Si falta, leerá / escribirá desde / al dispositivo de cinta real predeterminado del sistema. starcambió esto en 1982 para usar stdin / stdout por defecto y algunas otras implementaciones de tar (por ejemplo, gtar) siguieron este ejemplo recientemente.

  • tarno implementa las -opciones principales que se invocan key lettersen el caso del comando tar. Algunas implementaciones luego se agregaron -como una letra clave sin operación para la conveniencia de los usuarios, pero no puede confiar en esto.

  • La forma en que taranaliza sus argumentos (en particular el argumento del archivo comprimido) es muy arriesgado. He visto muchos archivos tar que destruyeron uno de los archivos que deberían estar en el archivo porque el argumento del archivo relacionado se tomó como archivo de archivo tar. starpor esta razón (si se llama de forma nativa como star) no permite que "f" se concatene con otras opciones. Si starse llama tar, implementa la compatibilidad con la línea de comandos tar, pero aún maneja el argumento para la letra de la tecla "f" de manera diferente: el argumento solo se permite si se refiere a un archivo de dispositivo real o cuando (en modo de escritura) el archivo aún no existe .

Recomiendo evitar la arriesgada línea de comando tar original y usar la sintaxis de línea de comando más segura y moderna con la que se obtiene star.

Debido a la problemática sintaxis de la línea de comandos tar, existían los llamados tar warsa principios de la década de 1990. Como resultado, el programa pax(latín para "paz" en las guerras de alquitrán) fue creado y estandarizado. paxsin embargo, no ganó popularidad ya que su sintaxis es menos riesgosa pero también menos intuitiva que la sintaxis tar. Otro problema puede ser que gpaxestá más o menos sin mantenimiento.

astuto
fuente
3
Las guerras de alquitrán han terminado. Guntar ganó.
Joshua
2
Si tenía razón, ¿por qué todas las implementaciones de tar copian características star?
schily
1
Por cierto: las guerras de alquitrán han sido una batalla entre tary cpio.
schily
2
Aceptar, por lo que parece starque está -f"$file"también (además de ind) un problema con los nombres de archivo a partir de =. Entonces uno necesita escribirlo -f="$file"o bien -f "$file". No estoy seguro de que llamaría a su opción estrella analizar más seguro o moderno .
Stéphane Chazelas
3
-longLas opciones largas de estilo son incompatibles con -xyzlas opciones cortas condensadas o -xarg. Es por eso que las opciones largas de estilo X11 requieren que las opciones cortas sean separadas ( -x -y, no -xy) y que los argumentos de opciones estén en argumentos separados ( xterm -n foo, no xterm -nfoo). Y es por eso que hay un guión adicional en las opciones largas de GNU, para eliminar la posible confusión con las opciones cortas, y por qué las opciones largas de estilo GNU son un mejor diseño. Puede haber -foocoexistido -x -y -xysolo si tiene mucho cuidado para evitar las superposiciones.
Stéphane Chazelas
55

El orden de los conmutadores es gratuito, pero -ftiene un argumento obligatorio que es el archivo que tarleerá / escribirá.

Podrías hacerlo

tar -zf foo.tar.gz -xv

y eso funcionará, y tiene su requisito de un orden no específico de interruptores.

Así es como funcionan todos los comandos que tienen opciones que tienen argumentos.

wurtel
fuente
55
Tar no funciona como otros comandos, ya que usa un analizador de línea de comando mucho más antiguo, el mismo que se usa en el comando "ar" y el comando "ps" antiguo (anterior a POSIX).
schily
1
Gracias por esto, la respuesta seleccionada, aunque exhaustiva, realmente no me permitió ver cuál era específicamente el problema. En retrospectiva, parece obvio por el mensaje de error que indica que tar estaba tratando de leer el archivo 'xv'
Josh Rumbut
1
Creo que también puede declararlo como -f=./myfile, es decir, f toma un valor, no es una bandera, es una entrada.
ThorSummoner
14

Tradicionalmente, las opciones de tar son más o menos "libres de orden" (el orden de las opciones fy bes importante si ambas están especificadas). Sin embargo, el uso de un guión inicial hace que GNU tar analice las opciones de una manera considerada más coherente con otros comandos, donde especificar una opción que requiere un argumento (como el nombre de archivo para f) consumirá inmediatamente el resto de la "palabra", si hay alguno, como argumento (tradicionalmente, tar usa la siguiente palabra como nombre de archivo / tamaño de bloque cuando fo bse especifica). En su caso, tomó "xv" como nombre de archivo.

Sin embargo, no se puede confiar en este comportamiento para la portabilidad. Para obtener la máxima portabilidad, debe evitar usar un guión, poner siempre el fúltimo y siempre poner un espacio entre fy el nombre del archivo. Sin embargo, esta es una simplificación que se descompone si necesita la bopción o, en general, cualquier opción (como C) que no sea fesa requiere un argumento.

Esto está documentado en la sección del Manual de alquitrán "Los tres estilos de opciones" . Algunas otras implementaciones (por ejemplo, FreeBSD) se refieren a las opciones de estilo antiguo como una "palabra de opción agrupada". Y, por supuesto, algunas implementaciones solo pueden admitir este tipo de opción y pueden o no ignorar un guión si se incluye. Esta es la única forma de invocación especificada en la Especificación Single Unix y, por lo tanto, se garantiza que funcione en casi todos los sistemas.

Aleatorio832
fuente
2
Tenga en cuenta que algunas implementaciones admiten otras opciones con argumentos (como Cen BSD o GNU tar. Schily tar lo admite como -C pero no como C, todos lo admiten como -C).
Stéphane Chazelas
0

En tar, el - en los conmutadores ha quedado en desuso hace muchos años y ya no es necesario. Tar solía decirte eso, pero ya no lo hace.

ie:
tar zxvf foo.tar.gz
tar zfxv foo.tar.gz

Both of these work fine without the -.
Pablo
fuente