¿Qué significa el guión "-" al final de un comando?

78

Dado el siguiente comando:

gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf 

¿Qué significa -al final del comando? ¿Es algún tipo de marcador de posición?

Eugene S
fuente
3
Un pequeño detalle para mencionar: el -no necesita estar al final del comando. Por ejemplo: ls -l | diff - /old_ls_output.txt.
manatwork el

Respuestas:

82

En este caso, significa 'entrada estándar'. Es utilizado por algún software (p tar. Ej. ) Cuando se requiere un argumento de archivo y necesita usar stdin en su lugar. No es una construcción de shell y depende del programa que esté utilizando. ¡Consulte la página de manual si tiene dudas!

En este caso, la entrada estándar es el argumento de la -fopción. En los casos en -que no es compatible, puede salirse con la suya usando algo como tar xvf /proc/self/fd/0o tar xvf /dev/stdin(este último es ampliamente compatible en varios dispositivos).

No confíe en que esto signifique 'entrada estándar' universalmente. Como no es interpretado por el shell, cada programa es libre de manejarlo como lo desee. En algunos casos, es una salida estándar o algo completamente diferente: en suella significa 'iniciar un shell de inicio de sesión'. En otros casos, no se interpreta en absoluto. La memoria muscular me ha hecho crear bastantes archivos nombrados -porque alguna versión de algún programa al que estaba acostumbrado no entendía el guión.

Alexios
fuente
44
También puede significar STDOUT, dependiendo del contexto.
bahamat
3
Y prácticamente cualquier otra cosa, ya que depende de los programas individuales interpretar.
Alexios
55
/dev/stdino /dev/stdoutpuede usarse si realmente desea una secuencia de entrada / salida. Tenga en cuenta que es una secuencia, los programas que desean buscar en un archivo pueden no funcionar correctamente con él, como sería el caso -(por ejemplo, ffmpeg)
Lekensteyn
3
En el caso de bash, el guión es interpretado por el shell. Consulte la Guía avanzada de secuencias de comandos Bash - Capítulo 3. Caracteres especiales , luego busque el texto [guión] o "redirección de / a stdin o stdout". Utilizando bashpuede usar el guión en la mayoría de los lugares que esperan un nombre de archivo. Es un complemento obvio para <| > En mi humilde opinión
bsd
44
No estoy convencido de que ese sea el caso. Primero, catmaneja -(verifique la página de manual). Una versión de shell integrada en catmight o might, no es estrictamente todo el shell. Además, si el shell se maneja -, podría decir echo -y se expandiría a otra cosa. En cambio, solo hace eco de un guión (no /dev/stdino /proc/self/fd/0). Y echo test > -solo crea un archivo llamado -, por lo que claramente tampoco lo maneja allí. Ah, y la página que enumeró no dice que es manejada por el shell , dice que puede usarla caty diff, ambos entienden los guiones explícitamente.
Alexios
13

En este caso, en -realidad es bastante inútil, suponiendo que esté ejecutando Linux:

GNU tar (la versión en Linux) acepta su entrada desde la entrada estándar por defecto. Si no desea este comportamiento y desea pasar el nombre del archivo como argumento de línea de comando, debe especificar el indicador f:

tar xf filename

Entonces esto es lo mismo que

tar x < filename

O, si la entrada se comprime como en su ejemplo:

gzip -dc filename | tar x

No tiene sentido especificar el findicador aquí en absoluto, pero debido a que se especificó, el nombre del archivo debe darse -para indicar que queremos leer de la entrada estándar (ver otra respuesta). Entonces, para repetir, esto es redundante y un poco extraño.

Además, la línea anterior se puede simplificar porque se le puede decir a GNU tar que transmita la entrada a través de gzipsí misma especificando el zindicador:

tar xfz filename

- No es necesario llamar gzipexplícitamente.

Konrad Rudolph
fuente
1
Nota: no todos tartienen zopción.
liori
2
La mayoría de los sistemas operativos que no sean Linux tienen el valor tarpredeterminado de la primera unidad de cinta, por razones históricas.
Gilles
1
@Gilles y BSD, y OS X, ... Pero tengo curiosidad: ¿qué otros sistemas excepto en algunas unidades centrales antiguas todavía utilizan una versión tal (lo que los sistemas que no sean unidades centrales siquiera tiene una unidad de cinta)?
Konrad Rudolph
1
@KonradRudolph Los tres BSD principales tienen por defecto una unidad de cinta ( /dev/sa0en FreeBSD 9.0, /dev/rst0en NetBSD 6.0 y OpenBSD 5.1). AIX 7.1 por defecto es /dev/rmt0. MINIX3 por defecto es /dev/sa0. (Verifiqué la última versión del sistema operativo en cada caso, estos no son "mainframes viejos"). Solaris es configurable a través de un archivo /etc, que creo que es por defecto una unidad de cinta. GNU tar, Schilling tar, OSX y BusyBox tienen por defecto stdin / stdout.
Gilles
1
@Gilles: volví a compilar tarpor defecto la segunda unidad de cinta, por razones obvias. :)
David Harkness