Next Generation Shell (NGS)
Next Generation Shell is a modern programming language for DevOps.
bash or Python? That's a square pegs for a round hole situation. Both are inadequate for Ops tasks. NGS aims to reduce your frustration and let you be more productive. There is no reason that you should be in this situation. (Python here represents also other general purpose programming languages).
bash does not meet any modern expectations for syntax, error handling nor has ability to work with structured data (beyond arrays and associative arrays which can not be nested). Let it go. You are not usually coding in assembly, FORTRAN, C, or C++, do you? They just don’t match the typical Ops tasks. Don’t make your life harder than it should be. Let it go. (Let’s not make it a blanket statement. Use your own judgement when to make an exception).
Python along with many other languages are general purpose programming languages which were not intended to solve specifically Ops problems. The consequence is longer and less readable scripts when dealing with files or running external programs, which are both pretty common for Ops.
See bash or Python? The Square Pegs and a Round Hole Situation blog post.
Shell user interface, the atrocity. Current shells as well as proposed alternatives treat UI as if nothing happened since the 70-s: mostly typing commands and getting some text back. Watch Unix shell - We can do better now 15 minutes video about what's wrong with the user interface and how NGS is fixing (WIP) that.
I like helping people. Reducing frustration and making people more productive just feels good. A scalable way to help is thorugh tools. That is why I created NGS. It is a programming language with typical Ops tasks in mind. See the use cases below. The next big planned part is the interactive shell.
You as the Ops person, probably wondering whether NGS would be a good fit for your tasks. NGS aims to be best fit for the use cases below.
Argv facility for convenient building of command line argumentsdebug() function which prints debug information, conditionally, depending on environment variable per-section settingstatus() reporting function (previous status is overridden with new status on screen)log() function which prints timestamped outputretry() and stop re-implementing it hundreds of timesSee Use Cases wiki page for more information about the use cases and examples.
The language is very useful. See the the bin folder for examples. NGS is used in Beame.io for miscellaneous scripting such as testing CLI tools, performance tests orchestration, cloud manipulation, etc.
The work on the shell has just started. It is not usable yet. The shell is being implemented in NGS. See the design document.
From George Nachman, creator of iTerm2:
Neat! This is totally the project I would do if I had unlimited free time :) I've wished for something like this for a long time. I think there's a lot of room for improvement over a basic TTY, and you've nailed some of the important things
On Linux: make sure curl and sudo are installed
On MacOS: make sure you have brew installed.
curl https://ngs-lang.org/install.sh | bash
ngs -pi 'sum(0..10)'sudo port install ngsbrew install ngssudo snap install ngsDocker repository is at https://hub.docker.com/r/ngslang/ngs/
docker run -it --rm ngslang/ngsAdd to your Github Action the following (make sure to release the version as required)
steps:
- uses: ngs-lang/[email protected]After that, ngs can be used by simply calling ngs in any run step
steps:
- uses: ngs-lang/[email protected]
- run: ngs -pi 'sum(10..100)'To run NGS as AWS Lambda Function see https://github.com/ngs-lang/ngs-aws-lambda
Please refer to extension located in https://github.com/ngs-lang/ngs-ipython-extension
Please refer to extension located in https://github.com/ngs-lang/ngs-aws-lambda
git clone https://github.com/ngs-lang/ngs.git
# or if using git over ssh
git clone [email protected]:ngs-lang/ngs.git
cd ngs./install.shsudo make installmake testsmake buildBuild is currently tested with the GitHub action in .github/workflows/build.yml and we currently test the following 64-bit architectures:
| system | gcc | clang |
|---|---|---|
| ubuntu 20.04 | 9, 10, 11 | 9, 10, 11 |
| debian 11.1 | 9, 10 | 9, 11 |
| macOS 10.15 | 9, 10, 11 | 10 |
| centos 7 | 9, 10, 11 | -- |
| amazonlinux 2 | default (7.3) | default (11) |
| fedora 34 | default (11) | default (12) |
| fedora 35 | default (11) | default (13) |
| archlinux | default (11.1) | default (13) |
Notes:
# If NGS is not installed (from the root of ngs project):
NGS_PATH=lib ./build/ngs SCRIPT_NAME.ngs
# If NGS is installed:
ngs SCRIPT_NAME.ngsTested as follows (some time ago):
If you have troubles compiling, please try to compile the commit tagged tested.
cd build
for i in $(<install_manifest.txt);do rm "$i";done# Debug when stuck (note to self mostly)
killall -SIGSEGV ngs
lldb --core /cores/core.XXXXXFormula/ngs.rb) somewhere else.ngs.rb copy, modify:url "https://github.com/ngs-lang/ngs/archive/v0.2.8.tar.gz" -> url "file:///PATH/TO/ngs.tgz"version "0.0.1-dev" (or alike)ngs, run tar czf ngs.tgz --exclude=build ngsbrew install -d -s ./ngs.rb (wherever the ngs.rb is)# Build the docker
docker build -t ngs .
# Run the container
docker run -it --rm ngs
# Use NGS inside the container
ngs -pi 'sum(0..10)'On Linux
# --- Linux ---
cd doc
rm -r out
mkdir out
./make.ngs outOn Mac, follow the instructions to create case sensitive volume.
# --- Mac --- One time setup ---
cd doc/
ln -s /Volumes/YOUR-VOLUME-NAME out
# --- Mac --- Each time ---
cd doc/
rm -r out/*;
./make.ngs outa = [1, 2, 3]
arr = a.map(X*2) # arr is now [2, 4, 6]
for i in arr {
echo(i)
}h = {"a": 1, "b1": 2, "b2": 3}
echo(h.filterk(/^b/).mapv(X+10)) # {b1=12, b2=13}F my_func(x:Int) x*10 # Single expression does not require { ... } syntax
doc This method is documented!
F my_func(s:Str) {
t = s * 2
"[" + t + "]" # Last value returned as the result
}
echo(my_func(1)) # 10
echo(my_func("xyz")) # [xyzxyz]
echo(my_func) # <MultiMethod with 2 method(s)>More information about the language and syntax in particular is in ngslang.1
NGS has AWS library based on concept of Declarative Primitives
TLDR:
This is how an instance can be created using NGS (real working code).
{
NGS_No open issues yet, or sync has not completed.