Entrada de línea de comando mientras un script en ejecución muestra símbolos extraños

8

Si uso bash shell cli y ejecuto algún programa que no regresa de inmediato, entonces ingreso algunas letras (básicamente escribo el siguiente comando antes de notar que el anterior no terminó) y la entrada siempre se ve así (especialmente cuando se usa teclas de flecha arriba y abajo :)

]]A^ or ]]B^

Y me pregunto, ¿es este tipo de entrada prematura 'dañino' de todos modos, o qué significa la cadena devuelta?

U2ros
fuente
1
Esto no es específico de bash, eliminaría esa etiqueta.
Didi Kohen

Respuestas:

8

Estas cadenas son la representación sin formato de los caracteres especiales que escribió (como inicio, final, flechas, tabulación, etc.).
Su efecto nocivo está controlado por el comando que está ejecutando, si está recibiendo información del terminal, estos caracteres serán parte de su entrada.
Si no recibe información del terminal, no debería tener ningún efecto adverso en ninguno de los sabores de Unix que conozco.

Didi Kohen
fuente
13

Algunas teclas de su teclado no corresponden a caracteres reales. Por ejemplo, Acorresponde al carácter apero las teclas Upy F1no tienen sus propios caracteres dedicados. Cuando se presionan esas teclas especiales, en lugar de obtener un solo carácter correspondiente a la tecla, el terminal traduce la pulsación de la tecla a una secuencia especial de varios caracteres que generalmente comienzan con el carácter de escape (generalmente se muestra como ^[). Por ejemplo, Upgeneralmente genera la secuencia ^[[A(es decir, 3 caracteres de una tecla: escape [, y A).

La razón por la que normalmente no se ve ^[[Aes porque la mayoría de las aplicaciones de consola son lo suficientemente inteligentes como para traducir las secuencias especiales en comandos útiles en lugar de simplemente repetirlas en la consola. Para hacer esto, apagan el eco incorporado del terminal y realizan su propio procesamiento de nivel inferior. Por ejemplo, cuando bashve ^[[A, ¹ se da cuenta de que significa que presionó Upy no hizo eco^[[A , hace un montón de cosas para eliminar todo lo que ha escrito hasta ahora, recuperar el comando anterior guardado en el historial e imprimirlo en su lugar.

Si ves ^[[Acuando presionasUp , eso generalmente significa que el eco del terminal está activado y el proceso en primer plano (el que controla el terminal) no está realizando ninguno de los procesos especiales mencionados anteriormente. Esto puede deberse a que la aplicación simplemente ignora el terminal (como la mayoría de los comandos no interactivos). Tenga en cuenta que, por lo general, el shell pone el terminal en modo canónico y activa el eco antes de ejecutar un proceso en primer plano, y restaura sus propios ajustes una vez que recupera el control del terminal después de que el comando sale.

El eco parece bastante inofensivo. Solo recuerde que si el comando en ejecución no lee desde la terminal, los caracteres que generó a través del teclado probablemente terminarán en bashla cola de entrada, así que tenga cuidado con lo que escribe, ya que probablemente se interpretarán como comandos normales una vez que bashreanude la lectura desde la terminal

¹ Esto es en realidad una simplificación excesiva. Dado que la secuencia específica puede variar según el tipo de terminal, generalmente hay varias capas de bibliotecas de abstracción entre una aplicación de consola y el terminal en sí. Por ejemplo, bashusa la readlinebiblioteca para hacer la mayor parte de su entrada.

jw013
fuente
1
Por lo que entendí de la pregunta, el caso aquí fue durante la ejecución de otro comando y no en el tiempo de plata entre la salida del proceso y antes de que bash restaurara la configuración del terminal. Sin embargo, voté por su respuesta, ya que explica el caso en detalle, a diferencia de mi respuesta, que es el mínimo absoluto necesario para responder.
Didi Kohen
@DavidKohen Creo que tienes razón sobre la pregunta original. Ajusté un poco mi respuesta para tener en cuenta cuando el comando aún se está ejecutando.
jw013