Nushell 的配置与使用
文档用途
介绍 nushell 的优势, 并说明如何安装配置和使用.
写在前面
这篇文档用介绍一种新的 shell, 即 nushell (可以简称 nu).
官网 www.nushell.sh 和 GitHub 主页 github.com/nushell/nushell.
Nushell 的优势
系统兼容性
首先考虑跨平台兼容性:
常见的 shell 包括 sh, bash, zsh, 它们都能在 Linux 和 macOS 系统中运行.
在 Windows 系统中, cmd 和 powershell 是最常见的选择, 另外也可以安装 git bash.
(git bash 和 bash 不一样, 但是提供了类似于 bash 的体验, 让 bash 看起来像是跨平台).
而 nushell 可以真正跨平台, 运行在这三个主流操作系统中.
错误提示
在输入命令的过程中就能看到 shell 语法高亮.
如果输入的命令存在错误, 会有非常清晰的错误提示.

结构化输出
如下图所示, 通过命令列出了当前文件夹下, 所有的文件 (不包括文件夹).
nushell 的很多命令都是以表格的形式在命令行界面中显示, 并且有颜色.
视觉效果友好, 方便进一步处理 (例如筛选).

shell 语法
nushell 语法和 bash 不同, 最大区别是: nushell 的语法是 强类型 的.
由于 nushell 比较新, 可以吸收前辈的经验教训, 在语法设计更合理, 也更容易上手.
这理论上是优势, 但实际上并非如此, 因为 shell 脚本非常有必要兼容 sh.
WARNING
考虑到 nushell 还未被广泛采用, 因此投入时间去学习如何编写 nushell 脚本可能不是个好选择.
建议仅将 nushell 作为 "更好的交互式命令行", 而在有写脚本的需求时统一使用 sh.
# 在 nushell 中可以这样执行其他 shell 的脚本.
sh my-script.sh安装与配置
安装 Nushell
# 通过 scoop 安装
scoop install nushell# 通过 HomeBrew 安装
brew install nushell# Linux 中建议通过源代码直接编译.
# 在编译前, 记得安装这两个依赖, 因为编译过程会用到.
sudo apt install pkg-config libssl-dev
# 如果已经安装了 rust, 则可以跳过这一步.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 通过 cargo 安装 nushell.
cargo install --locked nu在命令行界面中输入 nu, 即可进入 nushell.
首次运行时, 会询问用户是否下载默认的配置文件, 建议下载.
首次启动成功, 即可看到欢迎横幅:

配置文件
可以通过以下两行命令直接编辑配置文件:
config nu # 编辑 config.nu 文件
config env # 编辑 env.nu 文件也可以找到配置文件的位置并修改:
C:\Users\<用户名>\AppData\Roaming\nushell # Windows 中的配置文件夹路径
~/.config/nushell # Linux 和 macOS 中的配置文件夹路径通过以下命令可以找到配置文件的位置:
$nu.config-path # config.nu 文件位置
$nu.env-path # env.nu 文件位置INFO
可以参考笔者的配置, 详见 whisperpine/nushell.
默认的 shell
临时启用
也许我们不打算将 nushell 作为默认的 shell, 只想在需要时拿来临时用用.
那么就可以在任意命令行界面中输入 nu 来进入 nushell.
如果想离开 nushell, 则可以使用快捷键 Ctrl+D, 或输入 exit 命令.
Windows
在 Windows Terminal 中可以做如下设置:

vscode 中建议安装插件, 然后选择默认的 profile:

macOS
macOS 中需要提前设置好环境变量 PATH:
echo $PATH | pbcopy # 在系统默认 shell 中获取 PATH 的值并复制
nu # 启动 nushell
config env # 修改 nushell 的配置文件
# 添加下面这一行, 把 xxx 替换为刚刚复制的 PATH 的值
let-env PATH = ($env.PATH | split row (char esep) | prepend 'xxx')macOS 中修改 Terminal 设置:
通过 which nu 查看路径, 然后打开 Terminal 的设置修改路径:

为了避免在关闭 terminal tab 时弹窗, 需要作如下设置:

如果在 mac 中使用 iterm2 作为终端, 则应该做如下设置:

Linux
在 Linux 中, 可以通过以下命令来设置默认的 shell:
chsh -s [shell-path]然而还需要绕开一个限制: 在 /etc/shells 文件中包含了所有被允许的 shell.
我们需要将 nushell 可执行文件路径添加至 /etc/shells 中.
which nu # 可以查看 nushell 的可执行文件路径
sudo vim /etc/shells # 将上一步找的路径添加至文件结尾
chsh -s [nushell-path] # 最后修改当前用户登陆时默认的 shell快速上手
常用快捷键
补全命令 Ctrl+E.
正在输入命令时, 可能会有灰色提示, 此时通过快捷键 Ctrl+E 即可自动补全.


历史记录 Ctrl+R (此快捷键也可以用在 bash 中, 略有区别).
如下图所示, 可以通过 Ctrl+R 快捷键看到之前输入的命令的历史记录.
另外如果在命令行中输入了密码之类的敏感信息, 建议通过 history --clear 命令清除记录.

通过编辑器来编辑命令 Ctrl+O (在 bash 中对应的命令是 Ctrl+E Ctrl+X).
有些时候需要在命令写一条长命令, 此时为了方便可以打开默认的编辑器 (vim) 来编辑.
可以通过名为 EDITOR 的环境变量来设置默认的编辑器, 例如可以赋值为 vim 或 code.
常用命令
通过 start 命令, 使用文件浏览器打开目标路径:
在 Windows 中默认使用 Explorer, 在 macOS 中默认使用 Finder.
# 打开某个文件或文件夹
start [path]
# 使用系统默认的文件浏览器打开当前路径
start .通过 ps 命令列出所有进程, 并进一步通过 where 命令筛选:
# 列出内存占用超过 200MB 的进程
ps | where mem > 200MB
通过 sort-by 命令将前面的结果排序:
# 排序
[前面的命令] | sort-by [名称]
通过 get 命令将前面的结果的某个值取出来:
# 取值
[前面的命令] | get [名称]如果前面的命令的输出结果是键值对的形式 (可以嵌套), 就能用 get 命令.get 命令相当于是通过 key 来获取 value.

通过 to 命令将配置文件转换成其他格式:
# 转换
[前面的命令] | to [目标文件格式]如下图, to json 的结果就是将数据转换为 json 格式.
其他支持的格式还包括 csv html md toml xml yaml, 可以通过 help to 查看所有.

通过 find 命令根据名字查找 (类似于 grep 命令):
# 查找
[前面的命令] | find [名字]
界面美化
效果示例
INFO
Starship 不仅会让命令行界面更好看, 还能提供更多有用的信息.
如上图所示, 命令行中包含了一些有用的信息:
- 此工程使用 .NET 技术栈.
- 目录被简化成 git 工程的文件夹名称.
- 当前处于 main 分支, 并且
[+]表示存在未提交的修改.
安装 Starship
Starship 官网链接: https://starship.rs/.
一句话简介: 支持各种 shell 的小巧, 快速, 可高度自定义的命令行提示工具.
# 对于所有平台都可以通过 cargo 安装
cargo install --locked starship# Windows 可以直接安装编译好的版本
scoop install starship# 对于 macOS 和 Linux, 可以通过以下命令安装编译好的版本
curl -sS https://starship.rs/install.sh | sh启用 Starship
为了启用 Startship, 不同的 shell 需要做不同的操作.
由于这篇文档主要关于 nushell, 因此这里只说明如何为 nushell 其中 Startship.
通过 config env 命令打开 env.nu 配置文件, 然后在文件底部添加以下两行:
mkdir ~/.cache/starship
starship init nu | save -f ~/.cache/starship/init.nu通过 config nu 命令打开 config.nu 配置文件, 然后再文件底部添加:
source ~/.cache/starship/init.nu完整的配置文档详见 Configuration - Starship Docs.