Streams de Entrada/Salida Estándard AWK

La ejecución convencional de programa tiene tres streams de entrada y salida disponibles para lectura y escritura. Estos son conocidos como la entrada estándar, salida estándar y salida del error estándar. Estos streams son, por defecto, entrada y salida por terminal, pero son a menudo redireccionados con el shell, a través de los operadores `<', `<<', `>', `>>', `>&' y `|'. El error estándar se usa solamente para la escritura de mensajes de error; la razón por la cual tenemos dos streams separadas, salida estándar y error estándar, es para que puedan ser redireccionados

independientemente. En otras implementaciones de awk, la única forma de escribir un mensaje de error al error estándar en un programa awk es la siguiente:

print "Serious error detected!\n" | "cat 1>&2"

Esto trabaja abriendo un pipeline a un comando del shell el cual puede acceder a la stream del error estándar. Esto está lejos de ser elegante, y también es ineficiente, ya que requiere un proceso separado. Por lo que la gente que escribe programas awk se han negado a menudo a hacer esto. En su lugar, han enviado los mensajes de error al terminal, tal y como sigue:

NF != 4 {
printf("line %d skipped: doesn't have 4 fields\n", FNR) > "/dev/tty"
}

Esto tiene el mismo efecto la mayoría de las veces, pero no siempre: aunque el stream del error estandárd es normalmente el terminal, puede ser redireccionado, y cuando eso ocurre, la escritura al terminal no es lo correcto. De hecho, si awk se ejecuta desde un trabajo en background, podría no tener un terminal para poner la salida de dicho error. Entonces, abrir el dispositivo `/dev/tty' fallaría.

Gawk proporciona nombres de ficheros especiales para acceder a los tres streams estándar. Cuando redireccionas la entrada o la salida en gawk, si el nombre de fichero encaja con uno de estos nombres especiales, entonces gawk utiliza directamente el stream con el que se corresponde.


  • `/dev/stdin' La entrada estándar (descriptor de fichero 0).
  • `/dev/stdout' La salida estándar (descriptor de fichero 1).
  • `/dev/stderr' La salida del error estándar (descriptor de fichero 2).
  • `/dev/fd/n' El fichero asociado con el descriptor n. Tal fichero debería haber sido abierto por el programa que inicie la ejecución awk (normalmente el shell). A menos que hagas algo para que no sea así, solamente los descriptores 0, 1 y 2 están disponibles.


Los   nombres   de   ficheros    `/dev/stdin',   `/dev/stdout',    y   `/dev/stderr'  son    alias   para `/dev/fd/0', `/dev/fd/1', y `/dev/fd/2', respectivamente, pero los primeros nombres son más indicativos.

La forma más correcta para escribir un mensaje de error en un programa awk es usar `/dev/stderr', algo como esto:

NF != 4 {
printf("line %d skipped: doesn't have 4 fields\n", FNR) > "/dev/stderr"
}

El reconocimiento de estos nombres de fichero especiales es deshabilitado si awk está en modo compatibilidad


Publicar un comentario

0 Comentarios