Me pregunto si preguntaré la diferencia de estos dos comandos (es decir, solo el orden de sus opciones es diferente):
tar -zxvf foo.tar.gz
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-label
y -zfxv
dijo:
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 -f
al final!
AFAICT no hay necesidad de esta restricción, ¿o sí? porque, en mi opinión, los interruptores deben estar libres de pedidos.
linux
command-line
tar
khikho
fuente
fuente
gtar option parsing
, descubrió otra razón para no usar gtar.-f
espera que siga el nombre del archivo. En su segunda versión, especificó-fxv
que, para tar, significa que el nombre de archivo es "xv".Respuestas:
Al mirar su mensaje de error, es obvio que no lo usó,
tar
sino más biengtar
.En general, esto puede ayudar a comprender las cosas:
tar
normalmente siempre necesita un argumento de archivo. Si falta, leerá / escribirá desde / al dispositivo de cinta real predeterminado del sistema.star
cambió esto en 1982 para usar stdin / stdout por defecto y algunas otras implementaciones de tar (por ejemplo, gtar) siguieron este ejemplo recientemente.tar
no implementa las-
opciones principales que se invocankey letters
en 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
tar
analiza 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.star
por esta razón (si se llama de forma nativa comostar
) no permite que "f" se concatene con otras opciones. Sistar
se llamatar
, implementa la compatibilidad con la línea de comandostar
, 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 llamadostar wars
a principios de la década de 1990. Como resultado, el programapax
(latín para "paz" en las guerras de alquitrán) fue creado y estandarizado.pax
sin embargo, no ganó popularidad ya que su sintaxis es menos riesgosa pero también menos intuitiva que la sintaxis tar. Otro problema puede ser quegpax
está más o menos sin mantenimiento.fuente
star
?tar
ycpio
.star
que está-f"$file"
también (además deind
) 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 .-long
Las opciones largas de estilo son incompatibles con-xyz
las 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
, noxterm -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-foo
coexistido-x -y -xy
solo si tiene mucho cuidado para evitar las superposiciones.El orden de los conmutadores es gratuito, pero
-f
tiene un argumento obligatorio que es el archivo quetar
leerá / escribirá.Podrías hacerlo
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.
fuente
-f=./myfile
, es decir, f toma un valor, no es una bandera, es una entrada.Tradicionalmente, las opciones de tar son más o menos "libres de orden" (el orden de las opciones
f
yb
es 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 paraf
) 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 cuandof
ob
se 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 entref
y el nombre del archivo. Sin embargo, esta es una simplificación que se descompone si necesita lab
opción o, en general, cualquier opción (comoC
) que no seaf
esa 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.
fuente
C
en BSD o GNU tar. Schily tar lo admite como -C pero no como C, todos lo admiten como -C).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.
fuente