Para un comando, si se usa -
como argumento en lugar de un nombre de archivo significará STDIN o STDOUT.
Pero en este ejemplo, crea un archivo con el nombre
-
:echo hello > -
¿Cómo puedo hacer que
-
en este ejemplo signifique STDOUT?Por el contrario, ¿cómo puedo hacer que
-
signifique un archivo nombrado-
en ejemplos como:cat -
2>&-
construcción, que significa "descriptor cercano 2".Respuestas:
Usar
-
como nombre de archivo para significar stdin / stdout es una convención que utilizan muchos programas. No es una propiedad especial del nombre del archivo. El núcleo no se reconoce-
como especial, por lo que cualquier llamada al sistema que se refiera-
como nombre de archivo se usará-
literalmente como nombre de archivo.Con la redirección de bash,
-
no se reconoce como un nombre de archivo especial, por lo que bash lo usará como el nombre de archivo literal.Cuando
cat
ve la cadena-
como un nombre de archivo, la trata como un sinónimo de stdin. Para evitar esto, debe modificar la cadena que secat
ve de tal manera que todavía se refiere a un archivo llamado-
. La forma habitual de hacer esto es prefijar el nombre del archivo con una ruta -./-
, o/home/Tim/-
. Esta técnica también se usa para solucionar problemas similares en los que las opciones de la línea de comandos chocan con los nombres de archivo, por lo que un archivo al que se./-e
hace referencia no aparece como la-e
opción de línea de comando para un programa, por ejemplo.fuente
/dev/stdin
y/dev/stdout
están disponibles universalmente y se pueden usar en lugar de la-
convención.cat
caso, mediante la redirección en lugar de enumerar el argumento podría ayudar:cat <-
; sin embargo, sería difícil mezclar y combinar eso con la concatenación de más de un archivo a la vez.jmtd
la pregunta. :)En lugar de
echo hello > -
, puedes usarecho hello > /dev/stdout
.Mientras '-' es una convención que tiene que ser implementado por cada programa que quieran apoyarlo,
/dev/stdin
,/dev/stdout
y/dev/stderr
son, cuando son apoyados por el sistema operativo (al menos Solaris, Linux y BSD lo hacen), independientemente de la aplicación y luego funcionará como usted intentar.fuente
Como mencionó Camh ,
-
es solo una convención de nomenclatura utilizada por algunos programas. Si desea hacer referencia a estas transmisiones con un descriptor de archivo que el shell reconocerá, jiliagre estuvo en lo correcto al usar el nombre/dev/stdin
o, en su/dev/stdout
lugar. Esos nombres de archivo deberían funcionar en cualquier lugar donde funcionaría un nombre de archivo normal.Dicho esto, tu primer ejemplo es un poco tonto. Cualquier salida que sea capturada por el operador de redireccionamiento para escribir en un archivo ya está en la salida estándar, por lo que redirigirla y volver a escribirla de donde vino no sirve de nada. El comportamiento que usa allí es la tubería, no una redirección:
En su segundo ejemplo, simplemente necesita dar alguna indicación de que desea un archivo literal con ese nombre, no el alias interno que tiene. Puede hacerlo más fácilmente especificando una ruta al archivo como esta:
fuente
En cuanto a 1, el programa tiene que apoyarlo. No puedes usarlo arbitrariamente. En cuanto a 2, redirija la entrada desde (por ejemplo,
cat < -
).fuente
El enfoque '-' tiene muchos problemas. En primer lugar, requiere una interpretación del carácter '-' y muchos programas no realizan dicha interpretación. Y además, hay algunos programas que interpretan un guión como un delimitador que marca el final de las opciones de línea de comando. Los programas están escritos para trabajar con argumentos de nombre de archivo, el enfoque '-' es un truco, agradable pero débil.
La mejor manera es:
/dev/stdout
es un enlace simbólico de/dev/fd/1
fuente