There are (at least) 3 ways to do this:
- `term` and `ansi-term` act as terminal emulators; they run a normal shell, like bash, and act much like e.g. `xterm`. You can even use curses-based programs. I don't use this as I find it quite clunky, since normal Emacs navigation and editing doesn't work (since the key combos would conflict with those used by the shell and applications).
- `eshell` is the opposite extreme: it's a shell which you use instead of bash and friends. It has nice features like piping to a buffer, running Elisp (if that's what you're into) and (my favourite) using TRAMP to invoke SSH and sudo. I tend not to use it much other than for TRAMP. The most obvious problem is the limited support for piping.
- `shell` is half way between. It runs a normal shell like bash, but Emacs keeps control over the buffer. This means we can't use things like curses, but we can navigate and edit the buffer contents just like any other.
Emacs `shell` is my "default" terminal; I currently have 24 shell buffers open. For things like curses, I use a separate `st` window running DVTM.
As a bonus, we can actually use `shell` and TRAMP together: we first use TRAMP to connect somewhere, e.g. `/ssh:me@remote:/home/me` (we can do this using `cd` in `eshell`, or using `dired` mode, or whatever), then from there we invoke `shell`. We'll be dropped into a remote shell, just as if we'd run `ssh`, but Emacs will be able to do things like tab-completion for the remote system.