2022-06-07 21:47:08 +02:00
# Nushell <!-- omit in toc -->
2019-09-02 03:43:30 +02:00
[![Crates.io ](https://img.shields.io/crates/v/nu.svg )](https://crates.io/crates/nu)
2023-02-24 12:58:44 +01:00
[![Build Status ](https://img.shields.io/github/actions/workflow/status/nushell/nushell/ci.yml?branch=main )](https://github.com/nushell/nushell/actions)
2023-06-08 15:15:56 +02:00
[![Nightly Build ](https://github.com/nushell/nushell/actions/workflows/nightly-build.yml/badge.svg )](https://github.com/nushell/nushell/actions/workflows/nightly-build.yml)
2019-09-02 03:43:30 +02:00
[![Discord ](https://img.shields.io/discord/601130461678272522.svg?logo=discord )](https://discord.gg/NtAbbGn)
2019-10-02 16:34:08 +02:00
[![The Changelog #363 ](https://img.shields.io/badge/The%20Changelog-%23363-61c192.svg )](https://changelog.com/podcast/363)
2020-07-01 23:00:44 +02:00
[![@nu_shell ](https://img.shields.io/badge/twitter-@nu_shell-1DA1F3?style=flat-square )](https://twitter.com/nu_shell)
2023-02-24 12:58:44 +01:00
[![GitHub commit activity ](https://img.shields.io/github/commit-activity/m/nushell/nushell )](https://github.com/nushell/nushell/graphs/commit-activity)
[![GitHub contributors ](https://img.shields.io/github/contributors/nushell/nushell )](https://github.com/nushell/nushell/graphs/contributors)
2019-09-02 03:43:30 +02:00
2020-01-27 04:32:02 +01:00
A new type of shell.
2019-05-17 18:59:25 +02:00
2023-05-20 14:57:51 +02:00
![Example of nushell ](assets/nushell-autocomplete6.gif "Example of nushell" )
2019-08-23 07:23:53 +02:00
2022-06-07 21:47:08 +02:00
## Table of Contents <!-- omit in toc -->
- [Status ](#status )
- [Learning About Nu ](#learning-about-nu )
- [Installation ](#installation )
2023-05-20 14:57:51 +02:00
- [Configuration ](#configuration )
2022-06-07 21:47:08 +02:00
- [Philosophy ](#philosophy )
- [Pipelines ](#pipelines )
- [Opening files ](#opening-files )
- [Plugins ](#plugins )
- [Goals ](#goals )
- [Officially Supported By ](#officially-supported-by )
- [Contributing ](#contributing )
- [License ](#license )
2019-05-17 18:59:25 +02:00
2022-06-07 21:47:08 +02:00
## Status
2019-09-13 05:04:14 +02:00
2022-06-07 21:47:08 +02:00
This project has reached a minimum-viable-product level of quality. Many people use it as their daily driver, but it may be unstable for some commands. Nu's design is subject to change as it matures.
2019-09-13 05:04:14 +02:00
2022-06-07 21:47:08 +02:00
## Learning About Nu
2019-09-13 05:04:14 +02:00
2023-02-18 14:38:36 +01:00
The [Nushell book ](https://www.nushell.sh/book/ ) is the primary source of Nushell documentation. You can find [a full list of Nu commands in the book ](https://www.nushell.sh/commands/ ), and we have many examples of using Nu in our [cookbook ](https://www.nushell.sh/cookbook/ ).
2019-09-30 00:29:59 +02:00
2022-06-07 21:47:08 +02:00
We're also active on [Discord ](https://discord.gg/NtAbbGn ) and [Twitter ](https://twitter.com/nu_shell ); come and chat with us!
2020-01-24 18:51:24 +01:00
2020-06-23 20:21:47 +02:00
## Installation
2019-08-23 06:03:07 +02:00
2022-06-07 21:47:08 +02:00
To quickly install Nu:
2019-08-23 17:32:28 +02:00
2022-06-07 21:47:08 +02:00
```bash
# Linux and macOS
brew install nushell
# Windows
2021-11-14 07:34:57 +01:00
winget install nushell
2021-06-14 10:52:07 +02:00
```
2022-12-30 13:18:28 +01:00
To use `Nu` in GitHub Action, check [setup-nu ](https://github.com/marketplace/actions/setup-nu ) for more detail.
2022-06-13 11:40:38 +02:00
2022-06-07 21:47:08 +02:00
Detailed installation instructions can be found in the [installation chapter of the book ](https://www.nushell.sh/book/installation.html ). Nu is available via many package managers:
2019-09-06 22:05:35 +02:00
2019-09-30 22:39:16 +02:00
[![Packaging status ](https://repology.org/badge/vertical-allrepos/nushell.svg )](https://repology.org/project/nushell/versions)
2019-09-06 22:05:35 +02:00
2023-05-20 14:57:51 +02:00
## Configuration
The default configurations can be found at [sample_config ](crates/nu-utils/src/sample_config )
which are the configuration files one gets when they startup Nushell for the first time.
It sets all of the default configuration to run Nushell. From here one can
then customize this file for their specific needs.
To see where *config.nu* is located on your system simply type this command.
```rust
$nu.config-path
```
Please see our [book ](https://www.nushell.sh ) for all of the Nushell documentation.
2019-09-06 22:05:35 +02:00
2020-06-23 20:21:47 +02:00
## Philosophy
2019-06-15 04:24:13 +02:00
2020-03-13 18:23:41 +01:00
Nu draws inspiration from projects like PowerShell, functional programming languages, and modern CLI tools.
2022-06-07 21:47:08 +02:00
Rather than thinking of files and data as raw streams of text, Nu looks at each input as something with structure.
For example, when you list the contents of a directory what you get back is a table of rows, where each row represents an item in that directory.
2020-03-13 18:23:41 +01:00
These values can be piped through a series of steps, in a series of commands called a 'pipeline'.
2019-06-15 04:24:13 +02:00
2020-06-23 20:21:47 +02:00
### Pipelines
2019-06-15 04:24:13 +02:00
2020-03-13 18:23:41 +01:00
In Unix, it's common to pipe between commands to split up a sophisticated command over multiple steps.
Nu takes this a step further and builds heavily on the idea of _pipelines_ .
2022-06-07 21:47:08 +02:00
As in the Unix philosophy, Nu allows commands to output to stdout and read from stdin.
2020-03-13 18:23:41 +01:00
Additionally, commands can output structured data (you can think of this as a third kind of stream).
Commands that work in the pipeline fit into one of three categories:
2019-06-15 04:24:13 +02:00
2021-06-16 21:55:10 +02:00
- Commands that produce a stream (e.g., `ls` )
2022-10-17 13:23:11 +02:00
- Commands that filter a stream (e.g., `where type == "dir"` )
2022-06-07 21:47:08 +02:00
- Commands that consume the output of the pipeline (e.g., `table` )
2019-06-15 06:20:58 +02:00
Commands are separated by the pipe symbol (`|`) to denote a pipeline flowing left to right.
2019-06-15 04:24:13 +02:00
2020-06-23 20:21:47 +02:00
```shell
2022-06-07 21:47:08 +02:00
> ls | where type == "dir" | table
╭────┬──────────┬──────┬─────────┬───────────────╮
│ # │ name │ type │ size │ modified │
├────┼──────────┼──────┼─────────┼───────────────┤
│ 0 │ .cargo │ dir │ 0 B │ 9 minutes ago │
│ 1 │ assets │ dir │ 0 B │ 2 weeks ago │
│ 2 │ crates │ dir │ 4.0 KiB │ 2 weeks ago │
│ 3 │ docker │ dir │ 0 B │ 2 weeks ago │
│ 4 │ docs │ dir │ 0 B │ 2 weeks ago │
│ 5 │ images │ dir │ 0 B │ 2 weeks ago │
│ 6 │ pkg_mgrs │ dir │ 0 B │ 2 weeks ago │
│ 7 │ samples │ dir │ 0 B │ 2 weeks ago │
│ 8 │ src │ dir │ 4.0 KiB │ 2 weeks ago │
│ 9 │ target │ dir │ 0 B │ a day ago │
│ 10 │ tests │ dir │ 4.0 KiB │ 2 weeks ago │
│ 11 │ wix │ dir │ 0 B │ 2 weeks ago │
╰────┴──────────┴──────┴─────────┴───────────────╯
2019-06-15 04:24:13 +02:00
```
2022-06-07 21:47:08 +02:00
Because most of the time you'll want to see the output of a pipeline, `table` is assumed.
2020-03-13 18:23:41 +01:00
We could have also written the above:
2019-06-15 04:24:13 +02:00
2020-06-23 20:21:47 +02:00
```shell
2022-06-07 21:47:08 +02:00
> ls | where type == "dir"
2019-06-15 04:24:13 +02:00
```
2020-03-13 18:23:41 +01:00
Being able to use the same commands and compose them differently is an important philosophy in Nu.
2021-06-16 21:55:10 +02:00
For example, we could use the built-in `ps` command to get a list of the running processes, using the same `where` as above.
2019-06-15 04:24:13 +02:00
2020-06-23 20:21:47 +02:00
```shell
> ps | where cpu > 0
2022-06-07 21:47:08 +02:00
╭───┬───────┬───────────┬───────┬───────────┬───────────╮
│ # │ pid │ name │ cpu │ mem │ virtual │
├───┼───────┼───────────┼───────┼───────────┼───────────┤
│ 0 │ 2240 │ Slack.exe │ 16.40 │ 178.3 MiB │ 232.6 MiB │
│ 1 │ 16948 │ Slack.exe │ 16.32 │ 205.0 MiB │ 197.9 MiB │
│ 2 │ 17700 │ nu.exe │ 3.77 │ 26.1 MiB │ 8.8 MiB │
╰───┴───────┴───────────┴───────┴───────────┴───────────╯
2019-06-15 04:24:13 +02:00
```
2020-06-23 20:21:47 +02:00
### Opening files
2019-06-15 04:24:13 +02:00
2021-06-16 21:55:10 +02:00
Nu can load file and URL contents as raw text or structured data (if it recognizes the format).
2020-03-13 18:23:41 +01:00
For example, you can load a .toml file as structured data and explore it:
2019-06-15 04:24:13 +02:00
2020-06-23 20:21:47 +02:00
```shell
> open Cargo.toml
2022-06-07 21:47:08 +02:00
╭──────────────────┬────────────────────╮
│ bin │ [table 1 row] │
2022-11-29 20:10:11 +01:00
│ dependencies │ {record 25 fields} │
2022-06-07 21:47:08 +02:00
│ dev-dependencies │ {record 8 fields} │
│ features │ {record 10 fields} │
│ package │ {record 13 fields} │
2022-11-29 20:10:11 +01:00
│ patch │ {record 1 field} │
2022-06-07 21:47:08 +02:00
│ profile │ {record 3 fields} │
2022-11-29 20:10:11 +01:00
│ target │ {record 3 fields} │
2022-06-07 21:47:08 +02:00
│ workspace │ {record 1 field} │
╰──────────────────┴────────────────────╯
2019-06-15 04:24:13 +02:00
```
2022-06-07 21:47:08 +02:00
We can pipe this into a command that gets the contents of one of the columns:
2019-06-15 04:24:13 +02:00
2020-06-23 20:21:47 +02:00
```shell
> open Cargo.toml | get package
2022-06-07 21:47:08 +02:00
╭───────────────┬────────────────────────────────────╮
│ authors │ [list 1 item] │
│ default-run │ nu │
│ description │ A new type of shell │
│ documentation │ https://www.nushell.sh/book/ │
│ edition │ 2018 │
│ exclude │ [list 1 item] │
│ homepage │ https://www.nushell.sh │
│ license │ MIT │
2022-11-29 20:10:11 +01:00
│ metadata │ {record 1 field} │
2022-06-07 21:47:08 +02:00
│ name │ nu │
│ repository │ https://github.com/nushell/nushell │
│ rust-version │ 1.60 │
2022-11-29 20:10:11 +01:00
│ version │ 0.72.0 │
2022-06-07 21:47:08 +02:00
╰───────────────┴────────────────────────────────────╯
2019-06-15 04:24:13 +02:00
```
2022-06-07 21:47:08 +02:00
And if needed we can drill down further:
2019-06-15 04:24:13 +02:00
2020-06-23 20:21:47 +02:00
```shell
2020-10-26 07:55:52 +01:00
> open Cargo.toml | get package.version
2022-11-29 20:10:11 +01:00
0.72.0
2019-11-18 15:41:16 +01:00
```
2020-06-23 20:21:47 +02:00
### Plugins
2019-06-15 04:24:13 +02:00
2022-06-07 21:47:08 +02:00
Nu supports plugins that offer additional functionality to the shell and follow the same structured data model that built-in commands use. There are a few examples in the `crates/nu_plugins_*` directories.
2019-06-15 04:24:13 +02:00
2020-03-13 18:23:41 +01:00
Plugins are binaries that are available in your path and follow a `nu_plugin_*` naming convention.
2021-06-16 21:55:10 +02:00
These binaries interact with nu via a simple JSON-RPC protocol where the command identifies itself and passes along its configuration, making it available for use.
2020-03-13 18:23:41 +01:00
If the plugin is a filter, data streams to it one element at a time, and it can stream data back in return via stdin/stdout.
If the plugin is a sink, it is given the full vector of final data and is given free reign over stdin/stdout to use as it pleases.
2019-06-15 04:24:13 +02:00
2023-03-29 07:12:07 +02:00
The [awesome-nu repo ](https://github.com/nushell/awesome-nu#plugins ) lists a variety of nu-plugins while the [showcase repo ](https://github.com/nushell/showcase ) *shows* off informative blog posts that have been written about Nushell along with videos that highlight technical
2023-03-29 07:19:33 +02:00
topics that have been presented.
2023-01-03 13:50:21 +01:00
2020-06-23 20:21:47 +02:00
## Goals
2019-06-15 04:24:13 +02:00
Nu adheres closely to a set of goals that make up its design philosophy. As features are added, they are checked against these goals.
2022-06-07 21:47:08 +02:00
- First and foremost, Nu is cross-platform. Commands and techniques should work across platforms and Nu has first-class support for Windows, macOS, and Linux.
2019-06-15 04:24:13 +02:00
2022-06-07 21:47:08 +02:00
- Nu ensures compatibility with existing platform-specific executables.
2019-06-15 04:24:13 +02:00
2022-06-07 21:47:08 +02:00
- Nu's workflow and tools should have the usability expected of modern software in 2022 (and beyond).
2019-06-15 04:24:13 +02:00
2022-06-07 21:47:08 +02:00
- Nu views data as either structured or unstructured. It is a structured shell like PowerShell.
2019-06-15 04:24:13 +02:00
2021-02-03 03:06:11 +01:00
- Finally, Nu views data functionally. Rather than using mutation, pipelines act as a means to load, change, and save data without mutable state.
2019-06-15 04:24:13 +02:00
2021-08-04 22:57:57 +02:00
## Officially Supported By
2020-06-13 15:24:30 +02:00
2021-08-04 22:57:57 +02:00
Please submit an issue or PR to be added to this list.
- [zoxide ](https://github.com/ajeetdsouza/zoxide )
- [starship ](https://github.com/starship/starship )
2022-04-12 20:12:33 +02:00
- [oh-my-posh ](https://ohmyposh.dev )
2022-04-12 22:13:40 +02:00
- [Couchbase Shell ](https://couchbase.sh )
2022-04-21 13:50:32 +02:00
- [virtualenv ](https://github.com/pypa/virtualenv )
2023-04-05 20:08:32 +02:00
- [atuin ](https://github.com/ellie/atuin )
2023-06-19 02:49:33 +02:00
- [clap ](https://github.com/clap-rs/clap/tree/master/clap_complete_nushell )
2023-09-07 13:58:31 +02:00
- [Dorothy ](http://github.com/bevry/dorothy )
2023-10-10 18:59:20 +02:00
- [Direnv ](https://github.com/direnv/direnv/blob/master/docs/hook.md#nushell )
2022-04-12 20:15:34 +02:00
2020-06-23 20:21:47 +02:00
## Contributing
2020-04-24 02:20:55 +02:00
2022-06-07 21:47:08 +02:00
See [Contributing ](CONTRIBUTING.md ) for details. Thanks to all the people who already contributed!
2021-02-01 19:05:37 +01:00
< a href = "https://github.com/nushell/nushell/graphs/contributors" >
2023-09-05 16:52:21 +02:00
< img src = "https://contributors-img.web.app/image?repo=nushell/nushell&max=600" / >
2021-02-01 19:05:37 +01:00
< / a >
2021-02-06 02:18:38 +01:00
2020-06-23 20:21:47 +02:00
## License
2019-06-02 18:49:56 +02:00
2020-03-13 18:23:41 +01:00
The project is made available under the MIT license. See the `LICENSE` file for more information.