This is xiaq's experimental POSIX shell. If it works out, it will eventually to be integrated into Elvish.
License is BSD 2-clause.
Files in spec/oil
are derived from the
Oil, licensed under Apache License 2.0. See
spec/oil/LICENSE.
The majority of POSIX shell features are implemented.
The following features are currently missing:
- Closing FDs in redirections (
<&-
, 2.7.5, 2.7.6) - Background jobs and related features
- All of 2.9.3 "Async lists"
-
$!
-
bg
-
fg
-
jobs
-
wait
-
set -o monitor
(set -m
) -
set -o notify
(set -n
)
-
set -o errexit
(set -e
) -
set -o noexec
(set -n
) -
exec
-
getopts
-
hash
-
$LINENO
(2.5.3) - Signal handling
- All of 2.11 "Signals and error handling"
-
trap
- Interactive features
-
$ENV
(2.5.3) -
$PS1
(2.5.3) -
$PS2
(2.5.3) -
$PS4
(2.5.3) -
fc
-
set -o ignoreeof
-
set -o nolog
.
-
Some implemented features are incomplete:
-
In
<<-
heredocs, leading tabs in expansions are not stripped (2.7.4). Example:cat <<-EOF $(echo ' bar') EOF
This should print an empty line followed by a line of just
bar
, but currently this implementation has a tab before thebar
. -
Argument of variable expansions may not contain whitespaces (2.6.2). Example:
echo ${x=foo bar}
This should print
foo bar
(with one space) and assign$x
tofoo bar
(with two spaces). This implementation treats this as a syntax error now.
Since Go doesn't support fork
, subshells are run in the same process, with
their own virtualized working directories and variables. This approach has some
inherent limitations:
-
Some properties cannot be virtualized:
ulimit
,umask
andexec
(when implemented) will affect the entire process. -
Code that actually depends on subshells running in separate processes won't work correctly.
The following features are out of scope and will likely never be implemented:
-
set -h
. -
kill
andnewgrp
- both are widely available as standalone commands. -
Internationalization/localization. This includes support for
$LANG
,$LC_*
and$NLSPATH
.