Invocation
Eshell is both a command shell and an Emacs Lisp REPL. As a result, you can invoke commands in two different ways: in command form or in Lisp form.
You can use the semicolon (;) to separate multiple command invocations on a single line, executing each in turn. You can also separate commands with && or ||. When using &&, Eshell will execute the second command only if the first succeeds (i.e. has an exit status of 0); with ||, Eshell will execute the second command only if the first fails.
A command invocation followed by an ampersand (&) will be run in the background. Eshell has no job control, so you can not suspend or background the current process, or bring a background process into the foreground. That said, background processes invoked from Eshell can be controlled the same way as any other background process in Emacs.
If a command exits abnormally, Eshell will display its exit code in the next prompt.
3.1.1 Command form
Command form looks much the same as in other shells. A command consists of arguments separated by spaces; the first argument is the command to run, with any subsequent arguments being passed to that command.
~ $ echo hello
helloThe command can be either an Elisp function or an external command. Eshell looks for the command in the following order:
- As a command alias (see Aliases)
- As a built-in command (see Built-in Commands)
- As an external program
- As an ordinary Lisp function
If you would prefer to use ordinary Lisp functions over external programs, set the option eshell-prefer-lisp-functions to t. This will swap the lookup order of the last two items. You can also force Eshell to look for a command as an external program by prefixing its name with *, like *command (see Built-in Commands).
You can also group command forms together into a subcommand with curly braces ({}). This lets you use the output of a subcommand as an argument to another command, or within control flow statements (see Control Flow).
~ $ echo {echo hello; echo there}
hellothere3.1.2 Lisp form
Lisp form looks like ordinary Emacs Lisp code, because that’s what it is. As a result, you can use any syntax normally available to an Emacs Lisp program (see The Emacs Lisp Reference Manual).
~ $ (format "hello, %s" user-login-name)
hello, userIn addition, you can combine command forms and Lisp forms together into single statements, letting you use whatever form is the most convenient for expressing your intentions.
~ $ ls *.patch > (format-time-string "%F.log")This command writes a list of all files matching the glob pattern *.patch (see Globbing) to a file named current-date.log (see Redirection).