Você pode usar socat
para fazer o stdout de mydaemon
de um dispositivo terminal e ter todos os dados gravados lá enviados para um canal em socat
.
Aqui usando ls -l /proc/self/fd
no lugar de mydaemon
$ socat -u 'exec:"ls -l /proc/self/fd",pty,raw' - | tee file.out
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:32 0 -> /dev/pts/25
lrwx------ 1 stephane stephane 64 Aug 20 13:32 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:32 2 -> /dev/pts/25
lr-x------ 1 stephane stephane 64 Aug 20 13:32 3 -> /proc/30930/fd
Veja como o stdout de ls
é um novo dispositivo pty ( /dev/pts/26
)
Se você não tiver socat
, também poderá usar script
:
$ script -qc 'stty raw; ls -l /proc/self/fd' file.out < /dev/null
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:35 0 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:35 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:35 2 -> /dev/pts/26
lr-x------ 1 stephane stephane 64 Aug 20 13:35 3 -> /proc/31010/fd
(o < /dev/null
é para que script
não configure seu terminal no modo raw
).
Observe, entretanto, que nesse caso, todos os stdin, stdout e stderr são redirecionados para essa pty. Para stdin e stderr ficarem intocáveis como na abordagem socat
, você poderia fazer:
$ script -qc 'stty raw; exec <&3 2>&4 3<&- 4>&-; ls -l /proc/self/fd' file.out 3<&0 4>&2 < /dev/null
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:37 0 -> /dev/pts/25
lrwx------ 1 stephane stephane 64 Aug 20 13:37 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:37 2 -> /dev/pts/25
lr-x------ 1 stephane stephane 64 Aug 20 13:37 3 -> /proc/31065/fd
Nem todas as script
implementations / versions suportam a opção -c
ou -q
.
Note que alguns sistemas vêm com um script unbuffer
expect
para isso, mas tenha cuidado com vários erros e limitações.