Come segnalare la fine dell'ingresso stdin


82
  1. In Bash, ho imparato che il segnale finale può essere modificato da questo documento. Ma per impostazione predefinita come posso segnalare la fine dell'input stdin?
  2. Mi è capitato di scoprire che con cat e chardet, i loro input stdin possono essere segnalati come finiti da Ctrl + d. Ma mi sembra di ricordare che Ctrl + d e Ctrl + c sono simili alla conclusione dell'esecuzione di un comando in esecuzione. Quindi sbaglio?

Risposte:


114

Ctrl+D, quando digitato all'inizio di una riga su un terminale, indica la fine dell'input. Questo non è un segnale nel senso unix: quando un'applicazione legge dal terminale e l'utente preme Ctrl+D, l'applicazione viene informata che è stata raggiunta la fine del file (proprio come se stesse leggendo da un file e avesse passato il ultimo byte).

Ctrl+Cinvia un segnale, SIGINT . Per impostazione predefinita SIGINT (il segnale di interruzione) uccide l'applicazione in primo piano, ma l'applicazione può catturare il segnale e reagire in un modo diverso (ad esempio, la shell stessa cattura il segnale e interrompe la linea che hai iniziato a digitare, ma non lo fa ' t esce, mostra un nuovo prompt e attende una nuova riga di comando).

È possibile modificare i caratteri associati a end-of-file e SIGINT con il sttycomando, ad es. stty eof aRenderebbe ail carattere end-of-file e stty intr ^-disabiliterebbe il carattere SIGINT. Questo è raramente utile.


Grazie! Non Ctrl+Dsignifica Ctrl e capitale D o non importa?
Tim

5
@Tim: è la minuscola che vuoi ... la convenzione di scrivere i comandi da tastiera con maiuscole viene perché le etichette sulla tastiera sono sempre in maiuscolo e la cosa descritta è una SEQUENZA CHIAVE non il codice di caratteri reale che il programma vede. Sì, questo a volte confonde.
Caleb,

@Caleb: grazie! Come si specifica che la chiave è in maiuscolo? O c'è mai un caso del genere?
Tim

@Tim Su un terminale, le combinazioni di tasti Ctrl+Shift+De Ctrl+Dlo stesso carattere inviano comunque (carattere numero 4, di solito chiamato Ctrl+D).
Gilles,

2
@Tim Il terminale ha ricevuto Ctrl + D. Non invia un personaggio al programma. Quello che succede è che quando il programma legge dal terminale, il terminale dice "questa è la fine del file", come quando un programma tenta di leggere dopo la fine di un file su disco. La shell non è coinvolta affatto.
Gilles

23

Il tuo secondo punto mette insieme due cose completamente diverse.

  • Ctrl + C invia un segnale di interruzione al processo in esecuzione.
  • Ctrl + D invia un carattere Fine trasmissione .

Stai cercando quest'ultimo.


7
Potenziale di confusione qui: dal punto di vista dell'applicazione, nessun carattere reale viene inviato per ^ D. Ciò significa che l'applicazione non riceve quel personaggio dalla read(2)syscall.
Ulidtko,
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.