2013-03-14 4 views
7

Ho cercato online anche su StackOverflow per alcuni suggerimenti o indicazioni, ma tutto ciò che ho trovato è schiacciante e non so da dove iniziare. Chiede scusa se ho trascurato qualcosa di ovvio.Come creare un Terminale di base da zero

Voglio imparare come funziona un terminale e mi piacerebbe costruirne uno da zero, mi piacerebbe qualsiasi consiglio o suggerimento su materiale che copra i concetti e le funzionalità richieste in un terminale ma non voglio solo collegamenti a codice sorgente. Ho trovato molti progetti open source ma li trovo schiaccianti.

Preferirei costruire il mio terminale che può essere eseguito su OS X, Linux e/o Windows (probabilmente userei Java ma prenderei in considerazione altri linguaggi) e alla fine avrò un'interfaccia web (vorrei avere la mia console nel mio browser) So che è stato fatto ma voglio farlo io stesso così posso capire in dettaglio come funziona e solo avere un progetto da fare.

Quello che sto veramente cercando è un punto di partenza con materiale di lettura/tutorial per darmi un po 'di direzione. Se vuol dire fare un passo indietro verso qualcosa di ancora più semplice di un Terminale, sono felice di farlo una volta che ho qualcosa da programmare effettivamente che mi farà avanzare verso l'obiettivo principale

+0

Questo è un modo troppo ampio, SO non è davvero una fonte per procedure dettagliate o raccomandazioni di ciò. Ti suggerisco di dare un'occhiata all'origine di un terminale esistente. (Ce ne sono almeno due in java: [JCTerm] (http://www.jcraft.com/jcterm/) e [Terminator] (http://software.jessies.org/terminator/)) – millimoose

+0

@millimoose sicuramente ci sono concetti o funzionalità di base che sarebbero necessari in ogni terminale? Questo è quello che mi confonde su – jonnie

+1

Cerca in TTYs virtuali e codici di controllo ansi – Dougvj

risposta

1

L'idea di un terminale è un ciclo infinito che interpreta ed esegue ogni comando. Ecco un esempio in Perl:

use strict; 
use warnings; 

while(<>) { 
    system($_); 
} 

exit 0; 

So Perl non è la lingua più semplice da leggere (ma sicuramente è stato il più veloce di scrivere), ma questo è tutto ciò che serve per capire il programma di cui sopra:

<> legge dallo standard input.

system($_) eseguire il comando (dove $_ è una variabile Perl speciale che funziona all'interno di loop e rappresenta l'elemento attualmente valutato, quindi, nel nostro caso, il comando specificato).

È possibile provare a eseguire il programma precedente salvandolo sul computer come foo.pl, aprire un terminale ed eseguire perl foo.pl.

Quindi, questa è l'idea di base. Penso che ogni lingua implementa un comando system che fa lo stesso (il nome potrebbe cambiare, ma probabilmente è lo stesso). Puoi dare un'occhiata a man system per scoprire come funziona questo comando in C. Non conosco Java, ma sono abbastanza sicuro che devi cercare qualcosa di simile. Da questo punto di partenza, penso che tu possa iniziare a costruire il tuo terminale.

+0

Questa è una shell, non un terminale. – millimoose

+1

@millimoose, Sì, grazie per sottolineare la differenza. Tuttavia, se capisco bene, posso trasformare questa shell in un terminale aggiungendo un altro software che chiama questo al suo interno, non è vero? – Zagorax

+2

È possibile trasformare qualsiasi cosa in qualcosa schiacciando abbastanza funzioni.Quello che volevo dire è che una shell del sistema operativo è qualcosa che interpreta i comandi che avviano e gestiscono altri processi. Un tipico emulatore di terminale GUI sarebbe qualcosa che rende l'output (testo e caratteri di controllo) della shell in una finestra e afferra gli eventi della tastiera dal toolkit GUI e li traduce in qualcosa che la shell capisce (input di stdin e caratteri di controllo). Sono pezzi di software correlati, ed è per questo che puoi mescolarli insieme, ma svolgono compiti completamente diversi. – millimoose

2

Creare una connessione socket al computer di destinazione , [leggi se c'è qualcosa, mostra], [attendi l'input dell'utente, visualizza, invia quello alla presa], ripeti. Hai il terminale di base.