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.
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:
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. :)
-
no necesita estar al final del comando. Por ejemplo:ls -l | diff - /old_ls_output.txt
.Respuestas:
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
-f
opción. En los casos en-
que no es compatible, puede salirse con la suya usando algo comotar xvf /proc/self/fd/0
otar 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
su
ella 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.fuente
STDOUT
, dependiendo del contexto./dev/stdin
o/dev/stdout
puede 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)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". Utilizandobash
puede 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óncat
maneja-
(verifique la página de manual). Una versión de shell integrada encat
might 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/stdin
o/proc/self/fd/0
). Yecho 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 usarlacat
ydiff
, ambos entienden los guiones explícitamente.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
:Entonces esto es lo mismo que
O, si la entrada se comprime como en su ejemplo:
No tiene sentido especificar el
f
indicador 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
gzip
sí misma especificando elz
indicador:- No es necesario llamar
gzip
explícitamente.fuente
tar
tienenz
opción.tar
predeterminado de la primera unidad de cinta, por razones históricas./dev/sa0
en FreeBSD 9.0,/dev/rst0
en 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.tar
por defecto la segunda unidad de cinta, por razones obvias. :)