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 llamado-
en ejemplos como:cat -
Comentarios
Respuesta
El uso de -
como nombre de archivo para indicar stdin / stdout es una convención que utilizan muchos programas. No es una propiedad especial del nombre de archivo. El kernel no reconoce -
como especial, por lo que cualquier llamada al sistema que haga referencia a -
como nombre de archivo utilizará -
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 nombre de archivo literal.
Cuando cat
ve la cadena -
como un nombre de archivo, lo trata como un sinónimo de stdin. Para evitar esto, debe modificar la cadena que cat
ve de tal manera que aún se refiera 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 utiliza para solucionar problemas similares en los que las opciones de la línea de comandos entran en conflicto con los nombres de archivo, por lo que un archivo denominado ./-e
no aparece como -e
opción de línea de comando a un programa, por ejemplo.
Comentarios
- It ‘ s Vale la pena agregar que
/dev/stdin
y/dev/stdout
están disponibles universalmente y pueden usarse en lugar de-
convención. - @jmtd: / dev / std {in, out} no están disponibles universalmente. No todos los Unix lo tienen.
- Interesante, asumí que eran parte de POSIX (pero no puedo ‘ confirmar). Están ‘ presentes al menos en Linux, BSD y Solaris. ¿Puede dar un ejemplo de un UNIX moderno que carece de ellos?
- @camh No estoy seguro si recibió la notificación, y este es un tema muy, muy antiguo; ‘ no estoy seguro de si puedes, pero ‘ siento mucha curiosidad por saber la respuesta a
jmtd
‘ s pregunta? 🙂 - @jmtd Parece que he encontrado una respuesta provisional a la pregunta: unix.stackexchange.com/a/278368/31669
Responder
-
En lugar de
echo hello > -
, puede usarecho hello > /dev/stdout
.Si bien «-» es una convención que debe implementar cada programa que desee admitirla,
/dev/stdin
,/dev/stdout
y/dev/stderr
son compatibles con el sistema operativo (al menos Solaris, Linux y BSD lo hacen) , independiente de la aplicación y luego funcionará como lo desea.
Responda
Como mencionado por camh , -
es solo una convención de nomenclatura utilizada por algunos programas.Si desea hacer referencia a estos flujos con un descriptor de archivo que el shell reconocerá, jiliagre estaba en lo correcto al hacer que usara el nombre /dev/stdin
o /dev/stdout
en su lugar. Esos nombres de archivo deberían funcionar en cualquier lugar donde funcionaría un nombre de archivo normal.
-
Dicho esto, su primer ejemplo es un poco tonto. Cualquier salida que sea capturada por el operador de redirección para escribir en un archivo ya está en la salida estándar, por lo que redirigirla y escribirla de nuevo a su origen es inútil. El comportamiento que usa allí es la tubería, no un redireccionamiento:
echo hello |
-
En su segundo ejemplo, simplemente necesita dar algunos 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:
cat ./-
Respuesta
En cuanto a 1, el programa debe admitirlo. No puede usarlo arbitrariamente. En cuanto a 2, redirija la entrada de (por ejemplo, cat < -
).
Respuesta
El enfoque «-» tiene muchos problemas. En primer lugar, requiere una interpretación del carácter «-» y muchos programas no realizan tal interpretación. Y además, hay algunos programas que interpretan un guión como delimitador que marca el final de las opciones de la línea de comandos. 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:
$ echo hello > /dev/fd/1
/dev/stdout
es un enlace simbólico de /dev/fd/1
Comentarios
- La redirección es interpretada por el shell, no el programa que se invoca.
Respuesta
Los caracteres especiales tienen principalmente dos significados:
Cuadro numérico ASCII.
Scripting o simbólico.
Es posible que un solo carácter represente una cadena o actúe como una cadena. Según tengo entendido.
en lenguaje C fopen()
La función toma dos argumentos, el primer flujo de archivo y el segundo modo en el que se abrirá el archivo. El modo es una cadena. Incluso si es de un solo carácter.
cat > » – » funciona.
2>&-
construcción, lo que significa » cerrar descriptor 2 «.