¿Qué significa el guión "-" en "tar xzf -"?

23

Cuando intento instalar Dropbox desde la línea de comandos, leo los comandos

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

que -significa aqui ¿Es el directorio anterior?

Álgebra
fuente
99
Un poco de pedantería: la opción que estás pidiendo es f -. Esto podría hacer que encontrar la respuesta en las páginas de manual sea un poco más fácil.
Studog
44
Sería realmente útil si pudiera explicar qué, precisamente no está claro para usted sobre la documentación de wgety tar. De esa forma, los respectivos desarrolladores pueden mejorar su documentación para que los futuros usuarios no vuelvan a tropezar con los mismos problemas. En otras palabras: ¡sé un héroe y haz del mundo un lugar mejor!
Jörg W Mittag
2
Sería un buen valor predeterminado para tar utilizar stdin, pero como su herencia es trabajar con cintas, no lo hizo. En cambio, aprendió a trabajar con archivos (con la opción f) y luego sigue la convención para tener un - en lugar del nombre de archivo para stdin (en el caso de eXtract o stdout en el caso de Create)
eckes
1
@eckes En el caso de GNU tar, stdin es el valor predeterminado a menos que $TAPEesté configurado.
Chrylis -on huelga-

Respuestas:

42

Algunos comandos aceptan -en lugar de un nombre de archivo, ya sea:

  • Para escribir en la salida estándar en lugar de en un archivo con nombre. Esto es lo que hace el -argumento pasado wgetdespués -O.
  • Para leer desde la entrada estándar en lugar de desde un archivo con nombre. Esto es a lo -que pasó el argumento tardespués xzf.

El comando que mostró descarga un archivo con wgety lo descomprime tar. Para lograr esto, la salida de wgetse canaliza ( |) a la entrada de tar. Esta es la razón por la que wgetescribe en la salida estándar en lugar de un archivo y tarlee desde la entrada estándar en lugar de un archivo.

Eliah Kagan
fuente
Yo diría "la mayoría de los comandos" en lugar de solo "algunos comandos". Creo que es parte de la especificación de sintaxis de la opción POSIX.
Barmar
2
@Barmar Sí y no: Directriz 13: Para las utilidades que usan operandos para representar archivos que se abrirán para lectura o escritura, el operando '-' debe usarse para significar solo entrada estándar (o salida estándar cuando está claro desde el contexto que se especifica un archivo de salida) o un archivo llamado -. . Entonces, si - es un operando para una "opción de archivo" y tiene un significado especial, entonces debe ser el de stdin / stdout. El programa es gratuito para no tratarlo como un caso especial y simplemente buscar el archivo-
Bakuriu
(y normalmente en esos casos, omitir la opción será lo mismo que usar -)
Bakuriu
@Bakuriu No veo cómo eso refuta lo que dije. Sospecho que la mayoría de los comandos toman argumentos de nombre de archivo, por lo que se supone que deben seguir esa directriz. Pero tal vez debería haberlo calificado como "la mayoría de los comandos que operan en archivos".
Barmar
1
@Barmar Una forma de seguir la directriz es rechazar el tratamiento -especialmente en absoluto, tratándolo como un nombre de archivo literal. La única manera de ir en contra de la directriz es tratar -especialmente, pero con algún otro significado que los que sugiere la directriz.
Eliah Kagan
12

Es solo un nombre de archivo que muchos programas de Unix interpretan como "en lugar de abrir un archivo, leer stdin(o escribir stdout)".

Eso significa leer de la entrada que se transmite al programa; en su caso, esa es la salida de wget.

Marcus Müller
fuente
66
Sin embargo, ¿es realmente un nombre de archivo ?
Eric Duminil
77
@EricDuminil Es un nombre de archivo en el sentido de que los programas lo aceptan en algunos lugares donde de otro modo solo aceptarían nombres de archivo, pero tienes razón en que no se trata realmente del nombre real de un archivo en algún directorio.
JoL
55
@EricDuminil: en particular, para los programas que siguen esta convención, debe usar ./-si realmente desea abrir un archivo llamado -.
Jörg W Mittag
44
@EricDuminil De hecho: ¡sí! It nombres de un archivo ; en el sentido de Unix, stdines un descriptor de archivo y -es el nombre que proporciona para usarlo. Sin embargo, no es un nombre de archivo desde la perspectiva del sistema operativo. Solo desde la perspectiva del usuario.
Marcus Müller
3
@rexkogitans no. /dev/stdines solo un nombre de archivo de conveniencia ofrecido por alguna instalación de kernel. Por lo general, no fopen("/dev/stdin", "r") ocurre nada en ningún lugar cuando escribe un programa que elige usar stdin; simplemente continúe y use el extern FILE* stdinque le proporcionó su encabezado libc; por cierto, ese es el descriptor de archivo entero 0.
Marcus Müller
5

El -argumento para tarespecifica que el archivo debe leerse en stdinlugar de un archivo. Del manual de GNU tar :

Si lo utiliza -como nombre de archivo , tarlee el archivo de la entrada estándar (al enumerar o extraer archivos)

Otros comandos tienen el mismo comportamiento, y está especificado por el estándar POSIX.1-2017 :

Directriz 13 :

Para las utilidades que usan operandos para representar archivos que se abrirán para lectura o escritura, el -operando ' ' debe usarse para significar solo entrada estándar (o salida estándar cuando está claro por el contexto que se está especificando un archivo de salida) o un archivo nombrado -.

Tim
fuente