Se fate:
stty eol =
E quindi esegui la demo suggerita nel tuo EDIT , vedrai la barra di foo nella stampa di test.out . La disciplina di linea del terminale scaricherà il suo output sul suo lettore mentre legge ogni carattere eol speciale nel tuo input.
Un terminale in modalità canonica Linux - come può essere configurato con stty icanon
o probabilmente solo stty sane
- gestisce i seguenti caratteri di input speciali ...
- eof
- predefinito:
^D
- Termina una linea di input e scarica l'output sul lettore. Poiché viene rimosso dall'input, se viene immesso come unico carattere su una riga, viene passato al lettore come lettura null o fine del file .
- EOL
- impostazione predefinita: non assegnato
- Termina anche una riga di input, ma non viene rimosso dall'input.
- uccidere
- predefinito:
^U
- Cancella tutti gli input nel buffer.
- cancellare
- impostazione predefinita:
^H
(o eventualmente @
o ^?
su alcuni sistemi)
- Cancella l'ultimo carattere di input nel buffer.
Quando anche iexten è impostato - come stty icanon iexten
o, di nuovo, probabilmente solo stty sane
, un terminale canonico Linux gestirà anche ...
- eol2
- impostazione predefinita: non assegnato
- Inoltre anche termina una linea di ingresso, ed è anche non rimosso dall'ingresso.
- werase
- predefinito:
^W
- Cancella l'ultima parola di input memorizzata .
- rprnt
- predefinito:
^R
- Ristampa di tutti gli input bufferizzati.
- lnext
- predefinito:
^V
- Rimuove qualsiasi significato speciale per quanto riguarda la disciplina di linea per il carattere di input immediatamente successivo.
Questi caratteri vengono gestiti rimuovendoli dal flusso di input - ad eccezione di eol ed eol2 , ovvero - ed eseguendo la funzione speciale associata prima di passare il flusso elaborato al lettore - che di solito è la shell, ma potrebbe essere qualunque sia il gruppo di processi in primo piano .
Altri caratteri di input speciali che sono gestiti in modo simile ma che possono essere configurati indipendentemente da qualsiasi impostazione icanon includono il set isig - set like stty isig
e probabilmente incluso anche in una configurazione sana :
- smettere
- predefinito:
^\
- Svuota tutti gli input buffer (se non è impostato noflsh ) e invia SIGQUIT al gruppo di processi in primo piano, generando probabilmente un core-dump.
- sosp
- predefinito:
^Z
- Svuota tutti gli input buffer (se noflsh non è impostato) e invia SIGTSTP al gruppo di processi in primo piano. Il gruppo di processo sospeso può probabilmente essere ripreso con uno
kill -CONT "$!"
o solo fg
in una ( set -m
) shell controllata dal lavoro.
- intr
- predefinito:
^C
- Svuota tutti gli input buffer (se noflsh non è impostato) e invia SIGINT al gruppo di processi in primo piano.
E il set ixon - configurato come stty ixon
e anche solitamente incluso in una configurazione sana :
- fermare
- predefinito:
^S
- Interrompe tutto l'output al lettore fino a quando avvio viene letto in ingresso o - quando ixany è anche impostato - almeno un altro carattere viene letto.
- inizio
- predefinito:
^Q
- Riavvia l'uscita se è stata precedentemente arrestata con stop .
- Sia stop che start vengono rimossi dall'input durante l'elaborazione, ma se l'output viene riavviato a causa di un carattere in input quando ixany è impostato, quel carattere non viene rimosso.
I caratteri speciali gestiti su altri sistemi non Linux potrebbero includere ...
- rossore
- predefinito:
^O
- Attiva / disattiva l'eliminazione e lo svuotamento dell'input buffer e viene rimosso dall'input.
- dsusp
- impostazione predefinita: non assegnato
- Svuota tutti gli input nel buffer solo quando il lettore legge il carattere di input speciale assegnato quindi invia SIGTSTP.
E possibilmente...
- swtch
- impostazione predefinita
^@
(significato \0
o NUL
)
- Commuta i layer shell in primo piano. Da utilizzare con l' applicazione
shl
shell-layer su alcuni sistemi.
- Un'implementazione di
shl
cui multiplex ptys ed è quindi compatibile con il controllo del lavoro piuttosto che con il comportamento dipendente dall'implementazione originale dell'implementazione può essere liberamente inclusa nella heirloom-toolchest
suite di strumenti.
Per un quadro più chiaro di come e perché (e forse perché no) vengono gestite queste funzioni di input consultare man 3 termios
.
Tutte le funzioni di cui sopra possono essere assegnate (o riassegnate) - quando applicabile - come stty
function assigned-key
. Per disabilitare qualsiasi singola funzione fare . In alternativa, come sembrano indicare vari tentativi con assegnazioni per una qualsiasi delle funzioni di modifica della linea sopra menzionate con tutte le implementazioni di GNU, AST o heirloom , puoi anche come l' assegnazione NUL per qualsiasi funzione sembra equivalere a impostarla come non assegnata sul mio Linux sistema.stty
function
^-
stty
stty
function
^@
Probabilmente vedi un'eco di questi caratteri quando li digiti (come può essere probabilmente configurato con w / [-] ctlecho ) , ma questo è solo un indicatore per mostrarti dove sei stato - il programma che riceve i tuoi input non ha idea che tu li ha digitati (tranne eol [2] , cioè) e riceve solo una copia del tuo input a cui la disciplina di linea ha applicato i loro effetti.
Una conseguenza della gestione da parte del terminale delle varie funzioni di modifica della linea è che deve in qualche modo bufferizzare l'input per poter agire sulle funzioni che gli indichi che dovrebbe - e quindi non può esserci una fornitura illimitata di input che potresti uccidere in qualsiasi momento . Il buffer di linea è più precisamente il kill buffer.
Se imposti i caratteri eol o eol2 su un delimitatore che si verifica nell'input - anche se nessuno dei due è una nuova riga o un carattere di ritorno, per esempio - allora sarai in grado di uccidere fino al punto in cui si è verificato l'ultima volta e il tuo kill buffer si estenderà il più possibile fino al successivo di questi - o una nuova riga (o restituirà se icrnl è impostato e igncr non lo è) - si verifica nell'input.