arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
119 lines (78 loc) • 3.6 kB
Markdown
[Nash](https://github.com/NeowayLabs/nash) (or Nash shell) is a minimalist yet powerful [shell](/index.php/Shell "Shell") with focus on readability and security of scripts. It is inspired by Plan9 [rc](https://en.wikipedia.org/wiki/rc "wikipedia:rc") shell and brings to Linux a similar approach to [namespaces(7)](https://jlk.fjfi.cvut.cz/arch/manpages/man/namespaces.7) creation. There is a *nashfmt* program to correctly format nash scripts in a readable manner, much like the Golang [gofmt](https://golang.org/cmd/gofmt/) program.
## Contents
* [1 Installation](#Installation)
* [2 Configuration](#Configuration)
* [2.1 Organizing the init](#Organizing_the_init)
* [2.2 Configuring $PATH](#Configuring_.24PATH)
* [2.3 Making nash your default shell](#Making_nash_your_default_shell)
* [3 Usage](#Usage)
* [3.1 Keybindings](#Keybindings)
* [4 See also](#See_also)
## Installation
[Install](/index.php/Install "Install") the [nash-git](https://aur.archlinux.org/packages/nash-git/) package.
## Configuration
Make sure that nash has been successfully installed issuing the command below in your current shell:
`$ nash`
```
λ>
```
If it returned a lambda prompt, then everything is fine.
When first executed, nash will create a `~/.nash/` directory in the user's homepath. Enter the command below to discover by yourself what is this directory:
`λ> echo $NASHPATH`
```
/home/*username*/.nash
```
Put a file called `init` inside this directory to configure it.
Nash only has 1 special variables:
* `PROMPT` variable stores the unicode string used for the shell prompt.
*Nash* default *cd* is a very simple alias to the builtin function *chdir*; you may find it odd to use. To improve your usage you can create your own *cd* alias. In nash you cannot create aliases by matching string to strings, but only binding function to command names. The *init* below creates a *cd* alias as example:
```
defPROMPT = "λ> "
fn cd(path) {
if $path == "" {
path = $HOME
}
chdir($path)
PROMPT = "("+$path+")"+$defPROMPT
setenv PROMPT
}
# bind the "cd" function to "cd" command name
bindfn cd cd
```
After saving the init file, simply start a new shell and now you can use *cd* as if it were a builtin keyword.
```
git:(master)λ> nash
λ> cd
(/home/i4k)λ> cd /usr/local
(/usr/local)λ>
```
For a more elaborated *cd* or other aliases implementation, see the project [dotnash](https://github.com/tiago4orion/dotnash).
### Organizing the init
*Nash* scripts can be modular, but there is no concept of package. You can use the *import* keyword to load other files inside the current script session. For an example, see [dotnash init](https://github.com/tiago4orion/dotnash/blob/master/init).
### Configuring $PATH
Inside the *init* put the code below (edit for your needs):
```
path = (
"/bin"
"/usr/bin"
"/usr/local/bin"
$HOME+"/bin"
)
PATH = ""
for p in $path {
PATH = $PATH+":"+$p
}
setenv PATH
```
### Making nash your default shell
See [Command-line shell#Changing your default shell](/index.php/Command-line_shell#Changing_your_default_shell "Command-line shell").
## Usage
### Keybindings
The *cli* supports *emacs* and *vi* modes for common buffer editing. Default mode is *emacs* and you can change issuing:
```
λ> set mode vi
```
## See also
* [Nash shell](https://github.com/NeowayLabs/nash)
* [dotnash](https://github.com/tiago4orion/dotnash)
* [Autocomplete for nash shell](https://github.com/NeowayLabs/nashcomplete)