No puedo pensar en ninguna manera obvia de hacerlo. He aquí por qué ...
Su shell recibe su entrada desde, y envía su salida a, algunos terminales dispositivo:
+-----------+
| |
| bash |
| |
+-----------+
^|
| |
| v
+----------------------+
| some terminal device |
+----------------------+
Cuando write
escribe al terminal, envía los datos directamente al mismo dispositivo terminal . No va a ninguna parte cerca de su shell:
+-----------+ +-----------+
| | | |
| bash | | write |
| | | |
+-----------+ +-----------+
^| |
| | |
| v v
+----------------------+
| some terminal device |
+----------------------+
Por lo tanto, con el fin de que usted sea capaz de captar lo que se envía por write
, que había necesidad alguna de gancho proporcionada por el propio dispositivo terminal, y don No creo que haya nada que puedas usar para hacer esto.
Entonces, ¿cómo funciona script
, y por qué no captura la salida write
?
script
tampoco se puede enganchar en el dispositivo terminal. Realmente quiere interponerse entre su shell y su terminal, pero no hay una buena manera de hacerlo directamente.
Por lo tanto, crea un nuevo dispositivo terminal (un pseudo-terminal, también conocido como "pty") y ejecuta un nuevo shell en el mismo. Una pty consta de dos lados: el "maestro", que es solo una secuencia de bytes, y un "esclavo", que se parece a cualquier otro dispositivo terminal interactivo.
La nueva cáscara se une a la parte del esclavo, y script
controla el lado maestro - lo que significa que se puede ahorrar la corriente de bytes de un archivo, así como transmitirlas entre el nuevo shell y el terminal original:
+-----------+
| |
| bash |
| |
+-----------+
^|
| |
| v
+-----------------+ <=== slave side of pty -- presents the interface of
| pseudo-terminal | an interactive terminal
+-----------------+ <=== master side of pty -- just a stream of bytes
^|
| v
+-----------+
| |
| script |
| |
+-----------+
^|
| |
| v
+----------------------+
| some terminal device |
+----------------------+
Ahora se puede ver que un write
al dispositivo terminal original, no pasa por todo, al igual que lo hizo en el caso simple de arriba:
+-----------+
| |
| bash |
| |
+-----------+
^|
| |
| v
+-----------------+ <=== slave side of pty -- presents the interface of
| pseudo-terminal | an interactive terminal
+-----------------+ <=== master side of pty -- just a stream of bytes
^|
| v
+-----------+ +-----------+
| | | |
| script | | write |
| | | |
+-----------+ +-----------+
^| |
| | |
| v v
+----------------------+
| some terminal device |
+----------------------+
Si escribe datos en el lado del esclavo de la nuevo terminal aquí, aparecerá la salida, porque aparecerá en la secuencia de datos en el lado principal, que script
ve. Puede encontrar el nombre del nuevo pty con el comando tty
del shell dentro de script
.
Por desgracia, esto no ayuda con write
, ya que probablemente no será capaz de write
a ella: la sesión de conexión está asociado con el terminal original, no la nueva, y write
probablemente se quejará de que' no has iniciado sesión. Pero si por ejemplo echo hello >/dev/pts/NNN
, verá que aparece en la salida script
.
Gracias por la explicación larga y detallada, no me di cuenta de que 'script' funcionaba a través de un pseudo-terminal secundario, por lo que era interesante. Creo que intentaré invertir algo de tiempo para ver si obtengo el script para detectar el nuevo pty y lo uso original para mis propósitos, aunque tendré que intentar replicar la funcionalidad 'write' con algo que no se preocupa por el ID. –