You need to dive in history. There were typewritter-like devices with paper and keyboard. They were called teletypes (which means "type remotely" since "tele" means "remote") or **ttys** for short. In 70th they were obsoleted by devices with CRT monitor called glass **ttys**. Any computer need some way to report its status and errors (and, probably, accept commands). It is done through **console** which is almost always connected directly to computer. So, there are 2 meanings for **console**: something that is used to report status and something that is connected directly. UNIX is interactive system: several users may connect to it and start applications. First computers used teletypes (**tty**) for that: each user had teletype connected to machine with serial line connection. Such teletype is called **terminal**. UNIX also got special subsystem to handle "users sitting behind terminals" which is also called **tty** because first terminals were teletypes. Each process could be connected to tty in unix. That means there is a user somewhere sitting near terminal. See http://www.linusakesson.net/programming/tty/ for more info. User need some way to tell kernel to run application. **shell** (sh, bash, csh, ksh etc) is used for that. **shell** runs on **tty**, accepts commands from user and asks kernel to run some app. But terminals are not always physcially connected to machine. There may be some application that "emulates" terminal accepting keystrokes from user and sending them somewhere (xterm and ssh are good examples). There is an API in Kernel called **pseudo terminal** for that. So your **tty** may really be connected to some application instead of real terminal. Xterm uses X11 to display text and ssh uses network connection for it. IBM PC has keyboard and video card (they are also called **console** sometimes). Linux can do different things with it: * Use it as "engine to report errors and status": linux console. If you pass console=/dev/ttyS0 to kernel it will use something connected to COM1 as console, and if you do not it will use PC console. * Use it to emulate terminal, so called **virtual terminal** (vty). It also may stop emulating terminal on console and give it to some app. App may switch its video mode and use it exclusively (X11 or svgalib may do that). So, here are modern meanings: * terminal: Something with real user sitting behind it. Could be physical terminal (rare) or pseudo terminal (xterm, ssh) or virtual terminal (vty in linux) * shell: application (bash, tcsh, etc) that helps user to interact with system. * tty: either terminal or kernel subsystem to support terminals. * console: something where status and errors are reported (``/dev/console``) or physical keyboard and video display connected to computer.