Deberías usar /dev/stderr
o en /dev/fd/2
lugar de /proc/self/fd/2
. gawk
maneja /dev/fd/x
y /dev/stderr
por sí mismo (independientemente de si el sistema tiene esos archivos o no).
Cuando haces un:
print "x" > "/dev/fd/2"
gawk
hace un write(2, "x\n")
, mientras que cuando haces:
print "x" > "/proc/self/fd/2"
ya que no trata /proc/self/fd/x
especialmente, hace un:
fd = open("/proc/self/fd/2", O_WRONLY|O_CREAT|O_TRUNC);
write(fd, "x\n");
Primero /proc/self/fd
es específico de Linux y en Linux son problemáticos. Las dos versiones anteriores no son equivalentes cuando stderr corresponde a un archivo normal u otro que se puede buscar o a un socket (para el cual este último fallaría) (sin mencionar que desperdicia un descriptor de archivo).
Dicho esto, si necesita escribir en el stdout original, debe guardarlo en otro archivo como:
gawk -i inplace '{
print "goes into the-file"
print "to stdout" > "/dev/fd/3"}' the-file 3>&1
gawk
redirecciona stdout con in situ al archivo. Es necesario porque, por ejemplo, querrías:
awk -i inplace '{system("uname")}' file
para almacenar la uname
salida en el file
.
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
, solo usará awk para editar los archivos que realmente contienen líneas que coinciden con ese patrón.grep
puede ser. Mi primer instinto es evitar tener que "procesar" el archivo dos veces, pero no me sorprendería en absoluto si de todos modos es más rápido. Simplemente muestra por qué puedo confiar en mi instinto en las tareas de creación de perfiles-print -exec gawk
ya no se ejecuta) y 2) se detendrá en la primera coincidencia, a menos que la primera coincidencia esté en el última línea todavía no está procesando todo el archivo dos veces (es más como 1.X veces). Además, sigawk -i inplace
funciona asísed -i
, editará el archivo en el lugar de todos modos, es decir, actualizar las marcas de tiempo, el inodo, etc., incluso si no hubiera nada que editar ...