Eu acho que é possível se você anexar o processo do intérprete relacionado ao gdb. Eu tentei com este one-liner perl
perl -e 'do { print "x\n"; sleep(1) } while(1)'
e funciona, mas infelizmente não com um script bash semelhante.
Primeiro, você precisa descobrir o PID desse processo cuja saída você deseja capturar. Então comece gdb
em outro terminal e execute os seguintes comandos gdb
attach PID
call close(2)
call open("/abs/olu/te/path/filename", 65, 384)
detach PID
depois disso, todos os dados que são gravados stderr
são redirecionados /abs/olu/te/path/filename
, pois
attach PID
anexa o processo ao gdb e o interrompe
call close(2)
fecha o stderr
editor de arquivos do processo (para stdout
o editor de arquivos é 1)
call open(...)
abre um novo arquivo e pega o menor número inteiro não utilizado para o recém-criado editor de arquivos e
detach PID
continua o processo
Pelo menos na minha máquina. As duas primeiras linhas são compatíveis com POSIX, mas não a terceira.
O segundo e o terceiro argumento de open
na terceira linha estão documentados em man 2 open
. No meu caso, 65 significa que open
deve criar o arquivo e abrir o arquivo somente para gravação, ou seja, O_WRONLY | O_CREAT
(definido em fcntl.h
). O terceiro argumento diz aberto para criar o arquivo com permissão de leitura e gravação para o usuário, ou seja S_IWUSR | S_IRUSR
(definido em sys/stat.h
). Então, talvez você precise descobrir os valores apropriados em sua máquina.