Estoy mirando la salida de un proceso bash en ejecución conectado a una terminal, con fines educativos.
Mi proceso de bash tiene PID 2883.
yo tecleo
[OP@localhost ~]$ strace -e trace=openat,read,write,fork,vfork,clone,execve -p 2883 2> bash.strace
En una terminal. Luego entro en mi proceso de bash y tengo la siguiente interacción:
[OP@localhost ~]$ ls
Mirando la salida, veo
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
...
Estoy confundido en las dos últimas líneas. Parece que bash está intentando escribir dos indicaciones de shell? ¿Que está pasando aqui?
cat
, hay dos diferencias: lee la entrada línea por línea, y mientras hace eco de su entrada de nuevo a stdout, veo la entrada dos veces (una cuando escribo y una vez cuando cat hace eco).^A
se presiona un carácter TAB o (Ctrl-A) o los diversos caracteres especiales. Además, apaga el eco del terminal, para que pueda decidir qué salida para cada carácter de entrada en particular (de nuevo, TAB no suele generar una TAB.)cat
No hace nada de eso. Si lo hace, intente ejecutardash
, lo que no hace ningún manejo de línea de comando.read()
para leer solo un byte a la vez es que no puede leer más allá de una nueva línea. La nueva línea puede hacer que ejecute un programa externo, que también puede leer desde la misma entrada. (Y que el programa debe ser capaz de leer cualquier carácter después de la nueva línea.) Si no tenía que preocuparse por eso, podría llamarread()
con un límite más grande, y con el terminal en modo raw, seguiría siendo por lo general obtener la entrada un personaje a la vez (read()
búfer más grande aún podría devolver ambas líneas en la misma llamada Creo que no hay una garantía de queread()
sería siempre volver una sola línea en el modo de cocinado.