Nushell 0.84.0
Nushell, or Nu for short, is a new shell that takes a modern, structured approach to your command line. It works seamlessly with the data from your filesystem, operating system, and a growing number of file formats to make it easy to build powerful command line pipelines.
Today, we're releasing version 0.84.0 of Nu. This release adds exporting constants from modules, scope commands improvements, cosmetic changes, and many smaller changes to our commands.
Where to get it
Nu 0.84.0 is available as pre-built binaries or from crates.io. If you have Rust installed you can install it using cargo install nu.
NOTE: The optional dataframe functionality is available by cargo install nu --features=dataframe.
As part of this release, we also publish a set of optional plugins you can install and use with Nu. To install, use cargo install nu_plugin_<plugin name>.
Themes of this release / New features
(Major Breaking Change!) str replace matches substring by default (kubouch)
Breaking change
See a full overview of the breaking changes
str replace now matches a substring instead of a regular expression by default and the -s/--string flag is deprecated (will be removed altogether in 0.85). Matching a substring by default makes it more consistent with the rest of the Nushell's commands.
💡 Note! Since
str replaceis a widely used command, many scripts are going to break. Fixing it is easy:
- If you used
str replacewithout the-s/--stringflag, you used regex matching and you should add--regexflag to keep the previous functionality.- If you used
str replacewith the-s/--stringflag, you will get a deprecation warning. To get rid of the warning, simply remove the flag.
Constants from modules (WindSoilder, kubouch)
You can now use constants in modules and export them. Calling use on a module will create record containing all module's constants. You can also import the constants directly, for example with use module.nu const-name, without creating the module's record. Example:
> module spam {
export const X = 'x'
export module eggs {
export const Y = 'y'
export const viking = 'eats'
}
}
> use spam
> $spam
╭──────┬───────────────────╮
│ eggs │ {record 2 fields} │
│ X │ x │
╰──────┴───────────────────╯
> $spam.eggs
╭────────┬──────╮
│ Y │ y │
│ viking │ eats │
╰────────┴──────╯
> use spam eggs viking
> $viking
eatsThe exported values are true constants which means that you can use them in some scenarios where you cannot use normal variables, such as:
> module files {
export const MY_CONFIG = '/home/viking/.config/nushell/my_config.nu'
}
> use files MY_CONFIG
> source $MY_CONFIG # sources '/home/viking/.config/nushell/my_config.nu'New options for more compact table display (@zhiburt, #9796)
To save screen space, you can now display tables with the header directly displayed on the border through the $env.config.table.header_on_separator option.

Additionally you can now configure the padding left and right of the table cell content either separately or all at once to adjust the layout for your readability needs.

More consistent format ... commands (@sholderbach, @WindSoilder)
Breaking change
See a full overview of the breaking changes
With this release we moved several commands that serve to produce string output from a particular data type as format subcommands.
date formathas been renamed toformat date(#9788).into duration --convertwas previously used to provide string representations ofdurations. This option has been removed and you should now useformat duration. (#9902)format filesizethat was previously moved into the--features extraset is back in the core (#9978).
scope commands enhancements (kubouch, kubouch)
scope commands received a significant amount of improvements making them more useful for advanced introspection of Nushell's definitions.
scope externsnow lists known externals (defined withextern)scope aliasesis now fixed and lists names and usages of the aliases, not of the aliased commands (this used to cause some confusion)scope modulesnow lists all the exportable of the module, including submodules with their contents- all
scopecommands now list the definition's ID which can be used for reliable tracking of definitions. For example, a commandfooimported from a modulespamusinguse spamwill be namedspam foo, therefore, relying solely on names of the definitions can sometimes be misleading. module_namefield is no longer presentscope variablesnow denotes whether a variable is a constant or not
http commands now handle headers better (@jflics6460, @ineu
You can now pass headers directly as a record to the -H flag.
http get -H {cookie: "acc=foobar"} http://example.comWhen running a http command with --full to get additional metadata about the response you can now get both the request and the response header
http get --full -H {cooke: "my=cookie"} | get headers | get responseWork on the optional dataframe features (@ayax79)
@ayax79 has been working hard to update our dataframe command to work again with the stricter type check by consolidating internal logic (#9860, #9951).
Furthermore, dfr open now supports the avro exchange format and a new dfr to-avro command was added in #10019
Changes to other commands
Since last release, some commands have changed, here is a list of some interesting changed
- @atahabaki in #9841, #9856 and #9940: Some refinement of the
str expandcommand (it's a really cool command, i recommend you check it out 😃) - @fdncred in #9987: Allow
selectto take a variable with a list of columns - @fdncred in #10048: Allow
intas a cellpath forselect
Command organization (@storm, @sophiajt)
In our efforts towards stabilization we moved several commands either behind the --features extra build-flag or back into the core set of commands. The special str *-case commands for example have been moved out of the core set, while the bytes commands to deal with bytes in arbitrary encodings have returned to the core set. Furthermore all commands in the core set should now have helpful categories associated with them.
Deprecation and removal of commands (@amtoine, @sholderbach)
We previously used the term "deprecation" pretty loosely to describe the removal of commands while emitting a helpful error. We intend to now start to use deprecation to warn you before the final removal of a particular option or command. When we removed a command we will now properly refer to it as removal and started adding warnings where appropriate (e.g. str replace --string). As part of this update we removed some very old error helpers nudging you to upgrade to new commands.
Documentation
Thanks to @rgwood, @sholderbach, @kubouch and @fdncred the documentation has become a bit better in #9961, #9996, #10004 and #10057.
Notable bugfixes
- A panic when parsing the context of
letassignments has been fixed (@mengsuenyan in #9851) - Invoking
--helpon a script with adef maincommand will now report the script's name instead of a more confusingmain(@sophiajt in #9948) - Serious bugs in
parsethat produced incorrect output when given a long input stream have been fixed (@panicbit in #9925, #9950)
Bugfixes
Thanks to all the contributors who tackled one or more bugs!
| Name | Link | Description |
|---|---|---|
| @mengsuenyan | #9853 | Fix ~ | path type returning empty string |
| @mengsuenyan | #9851 | Fix the panic when type a statement similar to let f = 'f' $ in the nushell |
| @sophiajt | #9893 | Revert #9693 to prevent CPU hangs |
| @NotLebedev | #9935 | Nothing has the correct return type |
| @amtoine | #9947 | Force version to update when installing with toolkit.nu |
| @amtoine | #9967 | Fix panic with lines on an error |
| @rgwood | #9990 | Fix watch not handling all file changes |
| @nibon7 | #9784 | Fix a crash when moving the cursor after accepting a suggestion from the help menu |
| @meskill | #10007 | Fix parser to not update plugin.nu file on nu startup |
| @zhiburt | #10011 | nu-table: Fix padding 0 width issues |
| @3lvir4 | #10012 | Remove potential panic from path join |
| @kubouch | #10046 | Fix wrong path expansion in save |
| @zhiburt | #10050 | nu-table: Fix issue with truncation and text border |
| @sophiajt | #10052 | Fix default_env.nu after latest changes to str replace |
| @fdncred | #10067 | Allow return to return any nushell value |
| @fdncred | #10063 | Fix into datetime to accept more date/time formats |
And also to those who did tackle purely technical challenges!!
| Name | Link | Description |
|---|---|---|
| @IanManske | #9909 | Enable macOS foreground process handling |
| @sophiajt | #9933 | Add tests for script subcommands |
| @sophiajt | #9936 | Fix a couple clippy warnings |
| @IanManske | #9927 | Make Value::columns return slice instead of cloned Vec |
| @sophiajt | #9949 | Move help commands to use more structure in signatures |
| @fdncred | #9958 | Update strip-ansi-escapes to use new api |
| @rgwood | #9971 | Put heavy dataframe dependencies behind feature flag |
| @sholderbach | #9974 | Fixup dataframe build after #9971 |
| @meskill | #9976 | test: Clear parent environment to prevent leakage to tests |
| @kubouch | #10036 | Add additional span to IncorrectValue error |
Breaking changes
- #9902
date formathas been renamed toformat datefor consistency. - #9788 The option
into duration --convertto format durations has been removed. Use theformat durationcommand instead. - #10038
str replacenow by default matches to strings by default. If you want to use regexes you need to use the-rflag. The--stringsflag has been removed - #9632 To be unambiguous the duration type now does not report months or years. The largest unit reported is weeks as they have a consistent length compared to months or years.
- #9926 We moved some of the more exotic
strcase-commands behind the--features extrabuild-flag. This affects:str camel-casestr kebab-casestr pascal-casestr screaming-snake-casestr snake-casestr title-case
- #10053 make the charpage optional for
std clip - #10023 The output of the
scopecommands has changed
Internal breaking change only affecting plugin authors
- #9927 Make
Value::columnsreturn slice instead of cloned Vec
Full changelog
Nushell
- amtoine created
- remove Clippy flags from the PR template
- Revert "deprecate
--formatand--listininto datetime(#10017)" - make the charpage optional for
std clip - deprecate
--formatand--listininto datetime - fix the signature of
input list - fix the default config for
explore - fix panic with
lineson an error - add a test to make sure "nothing" shows up as "nothing" in help
- force version to update when installing with toolkit
- remove old deprecated commands
- Fix default prompt indicators
- fdncred created
- update install/build scripts to include
--locked - allow
helpto return aType::Table - try and fix
into datetimeto accept more dt formats - allow
returnto return any nushell value - enable/update some example tests so they work again
- try to document the more obscure testbin commands
- allow int as a cellpath for
select - allow
selectto take a $variable with a list of columns - update
strip-ansi-escapesto 0.2.0 and the latest reedline - update
strip-ansi-escapesto use new api - add keybinding for search-history
- add
header_on_separatoroptions to default_config.nu - updates
let-envsignature to remove required params - remove
vectorize_over_listfrom python plugin - update
formatsignature to allowrecordto be passed in - update
itemssignature to allowanyoutput - update
charsignature withTable - update to current reedline
- bump to dev version 0.83.2
- update install/build scripts to include
- sophiajt created
- Revert "pin serde to avoid https://github.com/serde-rs/serde/issues/2538"
- move 'bytes' back to commands
- pin serde to avoid https://github.com/serde-rs/serde/issues/2538
- fix default-env after latest changes
- Rename
mainto script name when running scripts - Auto-expand table based on terminal width
- fix the Cargo.lock file
- Move
help commandsto use more structure in signatures - Fix a couple clippy warnings
- Add tests for script subcommands
- Revert "Add an option to move header on borders"
- Re-align how prompt indicators work
- Simplify default style and match Rust code to config
- Revert 9693 to prevent CPU hangs
- sholderbach created
- Polish
CONTRIBUTING, add Rust style - Remove global clippy
-Afromtoolkit.nu - Remove clippy global
-Afrom CI - Pin reedline to 0.23.0
- Rename misused "deprecation" to removal
- Improve I/O types of
into decimal(/float) - Add search terms to
reject - Move
format duration/filesizeback into core - Fixup dataframe build after #9971
- Add
format durationto replaceinto duration --convert - Update
unicode-linebreakto0.1.5
- Polish
- kubouch created
- Remove "let config" warning
- Simplify virtualenv testing
- Recursively export constants from modules
- Add a few more fields to
scopecommands - Add additional span to IncorrectValue error
- Allow exporting extern-wrapped
- Fix wrong path expansion in
save - Change
str replaceto match substring by default - Remove dead code from tests
- Sort entries in
scopecommands; Fix usage of externs - Refactor
scopecommands - Fix example for
extern-wrapped
- zhiburt created
- sitiom created
- ineu created
- 3lvir4 created
- ayax79 created
- app/dependabot created
- meskill created
- nibon7 created
- rgwood created
- panicbit created
- bobhy created
- IanManske created
- atahabaki created
- stormasm created
- Categorification: move commands histogram and version out of the default category
- Categorification: move from Default category to Filters
- Categorification: move Path commands out of the default category
- Categorification: graduate nuon --- from the experimental category to the formats category
- Categorification: move uncategorized String commands to Category::Strings
- Cratification: move some str case commands to nu-cmd-extra
- NotLebedev created
- WindSoilder created
- mengsuenyan created
- app/ created
- jflics6460 created
Extension
Documentation
- jwarlander created
- hustcer created
- conqp created
- sholderbach created
- amtoine created
- BrewingWeasel created
- rgwood created
- oatovar created
- rprtr258 created
- LeoniePhiline created
Nu_Scripts
- fdncred created
- WindSoilder created
- Neur1n created
- EmilySeville7cfg created
- uroybd created
- amtoine created
- e2dk4r created