L'input dalla riga di comando mentre uno script in esecuzione mostra strani simboli


8

Se uso la bash shell cli ed eseguo un programma che non ritorna immediatamente, allora inserisco alcune lettere (fondamentalmente digitando il comando successivo prima di notare che il precedente non è finito) e l'input è sempre simile a questo (specialmente quando si utilizza tasti freccia su e giù :)

]]A^ or ]]B^

E mi chiedo, questo tipo di input prematuro è 'dannoso' in ogni caso, o cosa significa la stringa restituita?


1
Questo non è specifico per bash, rimuoverei quel tag.
Didi Kohen,

Risposte:


8

Queste stringhe sono la rappresentazione grezza dei caratteri speciali digitati (come home, end, frecce, tab ecc ...).
Il loro effetto dannoso è controllato dal comando che stai eseguendo, se riceve input dal terminale, questi caratteri faranno parte del suo input.
Se non riceve input dal terminale, non dovrebbe avere effetti negativi su nessuno dei sapori Unix che conosco.


13

Alcuni tasti della tastiera non corrispondono a caratteri reali. Ad esempio, Acorrisponde al personaggio ama i tasti Upe F1non hanno i loro caratteri dedicati. Quando vengono premuti quei tasti speciali, invece di ottenere un singolo carattere corrispondente al tasto, il terminale traduce il tasto premuto in una sequenza speciale di più caratteri che in genere iniziano con il carattere di escape (solitamente visualizzato come ^[). Ad esempio, di Upsolito genera la sequenza ^[[A(ovvero 3 caratteri da un tasto: escape [, e A).

Il motivo che normalmente non si vede ^[[Aè perché la maggior parte delle applicazioni della console sono abbastanza intelligenti da tradurre le sequenze speciali in comandi utili invece di farle eco nella console. Per fare ciò, disattivano l'eco integrata del terminale ed eseguono la propria elaborazione di livello inferiore. Ad esempio, quando bashvede ^[[A, ¹ capisce che significa che hai premuto Upe invece di echeggiare ^[[A, fa un sacco di cose per eliminare tutto ciò che hai digitato finora, recuperare il comando precedente salvato nella cronologia e stamparlo invece.

Se vedi ^[[Aquando premi Up, ciò significa in genere che l'eco del terminale è attivata e il processo in primo piano (quello che controlla il terminale) non sta eseguendo alcuna delle elaborazioni speciali sopra menzionate. Ciò può essere dovuto al fatto che l'applicazione ignora semplicemente il terminale (come la maggior parte dei comandi non interattivi). Si noti che in genere la shell mette il terminale in modalità canonica e attiva l'eco prima di eseguire un processo in primo piano e ripristina le proprie impostazioni una volta che riprende il controllo del terminale dopo la chiusura del comando.

L'eco sembra abbastanza innocuo. Ricorda solo che se il comando in esecuzione non legge dal terminale, i caratteri che hai generato tramite la tastiera finiranno probabilmente nella bashcoda di input, quindi fai attenzione a ciò che scrivi poiché probabilmente verranno interpretati come comandi normali una volta che bashriprendono a leggere dal terminal.

¹ Questa è in realtà una semplificazione eccessiva. Poiché la sequenza specifica può variare in base al tipo di terminale, in genere ci sono più livelli di librerie di astrazione tra un'applicazione console e il terminale stesso. Ad esempio, bashutilizza la readlinelibreria per eseguire la maggior parte del suo input.


1
Da quello che ho capito dalla domanda, il caso qui era durante l'esecuzione di un altro comando e non nel tempo d'argento tra l'uscita del processo e prima che bash ripristinasse le impostazioni del terminale. Ho votato a fondo la tua risposta, dal momento che sta spiegando il caso in dettaglio, a differenza della mia risposta che è il minimo indispensabile per rispondere.
Didi Kohen,

@DavidKohen Penso che tu abbia ragione sulla domanda originale. Ho modificato un po 'la mia risposta per tener conto di quando il comando è ancora in esecuzione.
jw013,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.