Estou olhando para a saída strace de um processo bash em execução conectado a um terminal, para fins educacionais.
Meu processo bash tem PID 2883.
Eu digito
[OP@localhost ~]$ strace -e trace=openat,read,write,fork,vfork,clone,execve -p 2883 2> bash.strace
Em um terminal. Em seguida, entro no meu processo bash e tenho a seguinte interação:
[OP@localhost ~]$ ls
Olhando para a saída, vejo
strace: Process 2883 attached
read(0, "l", 1) = 1
write(2, "l", 1) = 1
read(0, "s", 1) = 1
write(2, "s", 1) = 1
read(0, "\r", 1) = 1
write(2, "\n", 1) = 1
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fec6b1d8e50) = 3917
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3917, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "\33]0;OP@localhost:~\7", 23) = 23
write(2, "[OP@localhost ~]$ ", 22) = 22
...
Estou confuso nas duas últimas linhas. Parece que o bash está tentando escrever dois prompts de shell? O que está acontecendo aqui?
A
<ESC>]0;
sequência (mostrada como\33]0;
por strace) é a sequência de escape para definir o título da janela do terminal. Ele termina com o caractere BEL (\7
), então o primeirowrite
define o título da janela. O segundo imprime o prompt real. Observe que, mesmo com exceção da sequência de escape, eles não são exatamente os mesmos. O prompt tem um contorno[..]
enquanto o título da janela não.Também podemos ver que a primeira escrita vai para stdout (fd 1, o primeiro argumento para
write()
), e a segunda para stderr. Bash imprime o prompt para stderr, então a primeira gravação vem de outro lugar. Isso em algum lugar é provavelmentePROMPT_COMMAND
, como aquele nos scripts de inicialização padrão do Debian para Bash. Tem algo assim aí:Ele define que ,
PROMPT_COMMAND
se estiver executandoxterm
ourxvt
, que deve suportar essa sequência de escape.