Uso de guión (-) en lugar de un nombre de archivo

Para un comando, si se usa - como argumento en lugar de un nombre de archivo significará STDIN o STDOUT.

  1. Pero en este ejemplo, crea un archivo con el nombre -:

    echo hello > - 

    ¿Cómo puedo hacer que - en este ejemplo signifique STDOUT?

  2. Por el contrario, ¿cómo puedo hacer que - signifique un archivo llamado - en ejemplos como:

    cat - 

Comentarios

  • Ya que aparentemente tengo que tener 50 de reputación para comentar directamente .. En el comentario / dev / stdin / dev / stdout, AIX, que es un derivado legítimo de UNIX, no tiene estos pseudodispositivos. Y, como comentario adicional, LINUX no es un derivado de UNIX en ningún caso. Es un workalike compatible con POSIX, y el más popular de los sistemas operativos UNIX-ish ‘ s en este momento, pero no se equivoquen, esto no es UNIX. Pero, la esencia de las respuestas aquí es correcta. La notación » – » no se interpreta como especial por el shell y, por lo tanto, se pasa directamente a cada aplicación individual como un ARG. Si la aplicación no reconoce
  • También hay 2>&- construcción, lo que significa » cerrar descriptor 2 «.
  • @ user95873, lo que supongo que querías decir es: si bien Linux es similar a Unix, no todos los similares a Unix (o UNIX verdadero) son Linux . La cuestión de si Linux es o no ‘ t verdadero UNIX (es decir, cumple la Especificación Única de UNIX) no ‘ no tiene relación con / dev / problema std {in, out, err}. Como / dev / std {in, out, err} es una característica agregada , no faltante .

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

  1. En lugar de echo hello > -, puede usar echo 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.

  1. 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 | 
  2. 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *