Entrée de ligne de commande pendant qu'un script en cours d'exécution affiche des symboles étranges

8

Si j'utilise le shell bash cli et que j'exécute un programme qui ne revient pas immédiatement, alors j'entre quelques lettres (en gros, taper la commande suivante avant de remarquer que la précédente ne s'est pas terminée) et l'entrée ressemble toujours à quelque chose comme ça (en particulier lors de l'utilisation flèches haut et bas :)

]]A^ or ]]B^

Et je me demande, est-ce que ce type d'entrée prématurée est «nuisible» de toute façon, ou que signifie la chaîne renvoyée?

U2ros
la source
1
Ce n'est pas spécifique à bash, je supprimerais cette balise.
Didi Kohen

Réponses:

8

Ces chaînes sont la représentation brute des caractères spéciaux que vous avez tapés (comme home, end, flèches, tabulation etc ...).
Leur effet nocif est contrôlé par la commande que vous exécutez, s'il reçoit une entrée du terminal, ces caractères feront partie de son entrée.
S'il ne prend pas d'entrée du terminal, il ne devrait avoir aucun effet négatif sur l'une des saveurs Unix que je connais.

Didi Kohen
la source
13

Certaines touches de votre clavier ne correspondent pas à des caractères réels. Par exemple, Acorrespond au caractère amais les touches Upet F1n'ont pas leurs propres caractères dédiés. Lorsque ces touches spéciales sont enfoncées, au lieu d'obtenir un seul caractère correspondant à la touche, le terminal traduit la pression de touche en une séquence spéciale de plusieurs caractères qui commence généralement par le caractère d'échappement (généralement affiché comme ^[). Par exemple, Upgénère généralement la séquence ^[[A(c'est-à-dire 3 caractères à partir d'une seule touche: d'échappement,, [et A).

La raison que vous ne voyez normalement pas ^[[Aest que la plupart des applications de console sont suffisamment intelligentes pour traduire les séquences spéciales en commandes utiles au lieu de simplement les reproduire sur la console. Pour ce faire, ils désactivent l'écho intégré du terminal et effectuent leur propre traitement de niveau inférieur. Par exemple, quand bashvoit ^[[A, il se rend compte que ¹ des moyens que vous pressés Upet plutôt que de l' écho en ^[[Aarrière, il fait un tas de choses à supprimer tout ce que vous avez tapé jusqu'à présent, chercher la commande précédente enregistrée dans l' histoire, et qu'au lieu d' imprimer.

Si vous voyez ^[[Alorsque vous appuyez sur Up, cela signifie généralement que l'écho du terminal est activé et que le processus de premier plan (celui qui contrôle le terminal) n'effectue aucun des traitements spéciaux mentionnés ci-dessus. Cela peut être dû au fait que l'application ignore simplement le terminal (comme la plupart des commandes non interactives). Notez que généralement, le shell met le terminal en mode canonique et active l'écho avant d'exécuter un processus de premier plan, et restaure ses propres paramètres une fois qu'il reprend le contrôle du terminal après la fin de la commande.

L'écho semble assez inoffensif. N'oubliez pas que si la commande en cours d'exécution ne lit pas depuis le terminal, les caractères que vous avez générés via le clavier finiront probablement dans bashla file d'attente d'entrée de, alors faites attention à ce que vous tapez car ils seront probablement interprétés comme des commandes normales une fois la bashlecture reprise du terminal.

¹ Il s'agit en fait d'une simplification excessive. Étant donné que la séquence spécifique peut varier selon le type de terminal, il existe généralement plusieurs couches de bibliothèques d'abstraction entre une application console et le terminal lui-même. Par exemple, bashutilise la readlinebibliothèque pour effectuer la plupart de ses entrées.

jw013
la source
1
D'après ce que j'ai compris de la question, le cas ici était pendant l'exécution d'une autre commande et non dans le temps d'argent entre la sortie du processus et avant que bash ne rétablisse les paramètres du terminal. J'ai cependant voté pour votre réponse, car elle explique le cas en détail, contrairement à ma réponse qui est le minimum absolu nécessaire pour répondre.
Didi Kohen
@DavidKohen Je pense que vous avez raison sur la question d'origine. J'ai ajusté un peu ma réponse pour tenir compte du fait que la commande est toujours en cours d'exécution.
jw013