Você deve usar /dev/stderr
ou /dev/fd/2
em vez de /proc/self/fd/2
. gawk
manipula /dev/fd/x
e /dev/stderr
por si mesmo (independentemente de o sistema ter ou não esses arquivos).
Quando você faz um:
print "x" > "/dev/fd/2"
gawk
faz um write(2, "x\n")
, enquanto quando você faz isso:
print "x" > "/proc/self/fd/2"
como não trata /proc/self/fd/x
especialmente, faz um:
fd = open("/proc/self/fd/2", O_WRONLY|O_CREAT|O_TRUNC);
write(fd, "x\n");
Primeiro /proc/self/fd
é específico do Linux e no Linux eles são problemáticos. As duas versões acima não são equivalentes quando stderr é para um arquivo regular ou outro procurável ou para um socket (para o qual o último falharia) (sem mencionar que ele desperdiça um descritor de arquivo).
Dito isto, se você precisa escrever para o stdout original, você precisa salvá-lo em outro fd como:
gawk -i inplace '{
print "goes into the-file"
print "to stdout" > "/dev/fd/3"}' the-file 3>&1
gawk
redireciona o stdout in-loco para o arquivo. É necessário porque, por exemplo, você deseja:
awk -i inplace '{system("uname")}' file
para armazenar a saída uname
no file
.