Skip to content
Friendly and expressive Unix shell
Go Other
  1. Go 98.6%
  2. Other 1.4%
Branch: master
Clone or download
Pull request Compare This branch is 1174 commits behind elves:master.
Type Name Latest commit message Commit time
Failed to load latest commit information.
build Add builder info, and a -buildinfo flag. Dec 4, 2017
edit Remove unnecessary api.Client when Evaler is present. Dec 7, 2017
eval Fix build on Windows. Dec 4, 2017
getopt Fix go-vet errors. May 21, 2017
glob glob: Fix test case (but not implementation yet). Dec 5, 2017
parse parse: More descriptive error message for unexpected rune. Dec 4, 2017
store Replace SQLite with BoltDB (elves#441) Jul 19, 2017
sys sys/ and util/: Fix test cases on Windows. Dec 5, 2017
util util: Append, not truncate, log files. Dec 6, 2017
.appveyor.yml Add config for AppVeyor. Dec 4, 2017
.gitattributes Use .gitattributes to filter go sources through goimports Feb 10, 2014
.gitignore Updated .gitignore (elves#303) Jan 12, 2017
.travis.yml Drop support for Go 1.7. Nov 29, 2017 Spell "gettable" correctly. Oct 15, 2017
Dockerfile update Dockerfile Feb 9, 2016
Gopkg.lock Use persistent hashmap to implement map. Aug 31, 2017
Gopkg.toml Use the "dep" tool to manage dependencies. Jun 12, 2017
LICENSE Project rename: das -> elvish Jan 29, 2014
Makefile Add builder info, and a -buildinfo flag. Dec 4, 2017 README: Experimental Windows support; AppVeyor badge. Dec 4, 2017
build-and-upload.elv In Travis, build binary for windows-amd64. Dec 4, 2017
main.go Moving packages around. Dec 4, 2017

A friendly and expressive Unix shell

Build Status on Travis Build status on AppVeyor

GoDoc Coverage Status Go Report Card License Twitter

User groups: Gitter Telegram Group #elvish on freenode

Developer groups: Gitter Telegram Group #elvish on freenode


Elvish is a cross-platform shell suitable for both interactive use and scripting. It features a full-fledged, non-POSIX-shell programming language with advanced features like namespacing and anonymous functions, and a powerful, fully programmable user interface that works well out of the box.

... which is not 100% true yet. Elvish is already suitable for most daily interactive use, but it is not yet complete. Contributions are more than welcome!

This README documents the development aspect of Elvish. Other information is to be found on the website.

Building Elvish

To build Elvish, you need

  • A Go toolchain >= 1.8.

  • Linux (with x86 or amd64 CPU) or macOS (with reasonably new hardware).

    It's quite likely that Elvish works on BSDs and other POSIX operating systems, or other CPU architectures; this is not guaranteed due to the lack of good CI support and developers who use such OSes. Pull requests are welcome.

    Windows support is experimental.

The Correct Way

Elvish is a go-gettable package. To build Elvish, first set up your Go workspace according to How To Write Go Code, and then run

go get

The Lazy Way

Here is something you can copy-paste into your terminal:

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
mkdir -p $GOPATH

go get

for f in ~/.bashrc ~/.zshrc; do
    printf 'export %s=%s\n' GOPATH '$HOME/go' PATH '$PATH:$GOPATH/bin' >> $f

The scripts sets up the Go workspace and runs go get for you. It assumes that you have a working Go installation and currently use bash or zsh.

The Homebrew Way

Users of macOS can build Elvish using Homebrew:

brew install --HEAD elvish


In roguelikes, items made by the elves have a reputation of high quality. These are usually called elven items, but I chose "elvish" because it ends with "sh", a long tradition of Unix shells. It also rhymes with fish, one of the shells that influenced the philosophy of Elvish.

The word "Elvish" should be capitalized like a proper noun. However, when referring to the elvish command, use it in lower case with fixed-width font.

Whoever practices the Elvish way by either contributing to it or simply using it is called an Elf. (You might have guessed this from the name of the GitHub organization.) The official adjective for Elvish (as in "Pythonic" for Python, "Rubyesque" for Ruby) is Elven.

You can’t perform that action at this time.