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$xtofoo 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,umaskandexec(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. - 
killandnewgrp- both are widely available as standalone commands. - 
Internationalization/localization. This includes support for
$LANG,$LC_*and$NLSPATH.