I'd just like to share my joy in using the Emacs shell (Eshell), which I find to be a wonderful fusion of the Unix shell and a Lisp REPL. You can enter commands with or without parentheses. For example:
~ $ concat "foo" "bar"
foobar
~ $ (concat "foo" "bar")
foobar
Or ~ $ * 123 456
56088
~ $ (* 123 456)
56088
Eshell comes with several built-in commands implemented as Elisp functions. For example: ~ $ which cd echo ls which
eshell/cd is a byte-compiled Lisp function in ‘em-dirs.el’.
eshell/echo is a byte-compiled Lisp function in ‘em-basic.el’.
eshell/ls is a byte-compiled Lisp function in ‘em-ls.el’.
eshell/which is a byte-compiled Lisp function in ‘esh-cmd.el’.
~ $ ls -l /etc/h*
-rw-r--r-- 1 root wheel 446 2025-02-15 20:43 /etc/hosts
-rw-r--r-- 1 root wheel 0 2024-10-01 2024 /etc/ hosts.equiv
~ $ (eshell/ls "-l" (eshell-extended-glob "/etc/h*"))
-rw-r--r-- 1 root wheel 446 2025-02-15 20:43 /etc/hosts
-rw-r--r-- 1 root wheel 0 2024-10-01 2024 /etc/hosts.equiv
Of course, you can still run external commands like usual: ~ $ which curl jq python3 rustc
/usr/bin/curl
/opt/homebrew/bin/jq
/opt/homebrew/bin/python3
/Users/susam/.cargo/bin/rustc
~ $ python3 -c "print('hello')"
hello
~ $ curl -sS https://hacker-news.firebaseio.com/v0/item/43061183.json | jq -r .title
Schemesh: Fusion between Unix shell and Lisp REPL
Since TRAMP is an integral part of Emacs, you can switch between the local shell and remote shells transparently with simple 'cd' commands. For example: ~ $ echo local > /tmp/foo.txt
~ $ echo remote > /ssh:susam@susam.net:/tmp/foo.txt
~ $ cd /tmp/
/tmp $ cat foo.txt
local
/tmp $ hostname
mac.local
~ $ cd /ssh:susam@susam.net:/tmp/
/ssh:susam@susam.net:/tmp $ hostname
susam.net
/ssh:susam@susam.net:/tmp $ cat foo.txt
remote
In the second command, I redirected a file to a remote file system with the usual '>' redirection operator.Notice how, in the sixth command, I switched from my local shell to a remote shell with a simple 'cd' command. With Eshell and TRAMP, working across multiple remote systems becomes transparent, seamless, and effortless! Best of all, I still have the full power of Emacs at my fingertips, making Eshell an incredibly smooth and powerful experience!