• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

一款很火的智能化 Shell 工具多色彩优化命令显示结果可以替换系统默认的 Shell 工具,支持多平台免费开源使用

武飞扬头像
代码讲故事
帮助1

一款很火的智能化 Shell 工具多色彩优化命令显示结果可以替换系统默认的 Shell 工具,支持多平台免费开源使用。

Nushell,它是用Rust写的,安全性提高的同时,Bug率也降低了,NuShell 专注于实现以下目标:

1、创建具有现代感的灵活的跨平台Shell

2、允许你将命令行应用程序与可理解数据结构的Shell进行混合和匹配

3、具有现代命令行应用程序提供的用户体验优化

学新通
简单的效果演示:
学新通
NuShell的目标是彰显 Shell 的 Unix 哲学,就是用管道将简单的命令连接在一起,并且带来现代的开发风格。Nu 从许多熟悉的领域中汲取了线索:bash 等传统 shell,PowerShell 等高级 shell,函数式编程,系统编程等。但是 Nu 并没有试图成为所有行业的杰作,而是将精力集中在做好一些事情上:

创建具有现代感的灵活的跨平台 Shell

允许你将命令行应用程序与可理解数据结构的 Shell 进行混合和匹配

具有现代命令行应用程序提供的用户体验优化

NuShell使用Rust编写,安全性提高的同时,Bug率也降低了


在 Linux / macOS 系统上运行 NuShell 的最简单快捷的方法是从crates.io安装 ,或从我们的Github 发布页面下载预构建的二进制文件。

对于任何 Linux 发行版来说,最理想的安装方法是二进制方法。我们将使用 curl 工具获取最新版本,下载然后解压缩文件以获得 Nushell 二进制文件。

安装开发人员工具

Ubuntu / Debian:

sudo apt update
sudo apt install pkg-config libssl-dev -y
sudo apt install libxcb-composite0-dev libx11-dev -y

基于 RHEL 的系统:

sudo yum install libxcb openssl-devel libX11-devel -y

苹果系统:

brew install openssl cmake

在 Linux 上安装 Nushell

下载最新的二进制归档文件:

cd /tmp

curl -s  https://api.github.com/repos/nushell/nushell/releases/latest | grep browser_download_url |  cut -d '"' -f 4 | grep '\linux.tar.gz' | wget -i -

解压下载的文件:

tar -xvf nu_*_linux.tar.gz

将二进制文件复制到您的 PATH:

sudo mv nu_*_linux/nushell-*/nu /usr/local/bin

Nushell将在启动时在您的 PATH中查找插件。虽然Nushell在没有它们的情况下会有一些功能,但要获得完整的功能,你需要将它们复制到您的路径中,以便加载它们。

sudo mv nu_*_linux/nushell-*/nu_plugin* /usr/local/bin

Fedora 用户可以使用COPR repo安装Nushell:

sudo dnf copr enable atim/nushell -y && sudo dnf install nushell -y

在 macOS 上安装 Nushell

对于二进制安装方法,请使用 brew:

$ brew install nushell

从二进制文件手动安装
在 macOS 系统上运行以下命令来下载 Nushell 的最新版本:

cd /tmp

curl -s  https://api.github.com/repos/nushell/nushell/releases/latest | grep browser_download_url |  cut -d '"' -f 4 | grep '\macOS.zip' | wget -i -

解压下载的文件:

unzip nu_*_macOS.zip

将nu二进制文件复制到你的PATH:

sudo mv nu_*_macOS/nushell-*/nu /usr/local/bin

复制Nu插件:

sudo mv nu_*_macOS/nushell-*/nu_plugin* /usr/local/bin
 在Docker运行Nushell 

如果你是windows用户,那么,建议你直接在Docker运行体验就好了,几句命令就搞定了,命令如下:

docker run -it quay.io/nushell/nu:latest

学新通
将用户 Shell 设置为 Nushell

创建一个名为techviewleo的新用户:

$ sudo adduser techviewleo
Adding user `techviewleo' ...
Adding new group `techviewleo' (1000) ...
Adding new user `techviewleo' (1000) with group `techviewleo' ...
Creating home directory `/home/techviewleo' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for techviewleo
Enter the new value, or press ENTER for the default
    Full Name []:
    Room Number []:
    Work Phone []:
    Home Phone []:
    Other []:
Is the information correct? [Y/n] y

将用户默认 shell 设置为 Nu:

sudo chsh -s /usr/local/bin/nu techviewleo

切换到创建的用户帐户:

$ su - techviewleo
Password:
Welcome to Nushell 0.28.0 (type 'help' for more info)
/home/techviewleo>

测试 ls 命令在 Nushell 中的工作方式:

ls

ls | where size > 10kb
sys

sys | get disks

运行效果展示:

学新通


Nushell 不是 Bash
Nushell 既是一种编程语言,也是一种 Shell,正因为如此,它有自己的方式来处理文件、目录、网站等等。我们对其进行了建模,以使其与你可能熟悉的其他 Shell 的工作方式接近。其中管道用于将两个命令连接在一起:

ls | length

Nushell 也支持其他常见的功能,例如从之前运行的命令中获取退出代码(Exit Code)。

虽然它确实有这些功能,但 Nushell 并不是 Bash。Bash 的工作方式以及一般的 POSIX 风格,并不是 Nushell 所支持的。例如,在 Bash 中你可以使用:

echo “hello” > output.txt

在 Nushell 中,我们使用>作为大于运算符,这与 Nushell 的语言特质比较吻合。取而代之的是,你需要用管道将其连接到一个可以保存内容的命令:

echo “hello” | save output.txt

以 Nushell 的方式思考: Nushell 看待数据的方式是,数据在管道中流动,直到它到达用户或由最后的命令处理。Nushell 使用命令来完成工作,学习这些命令以及何时使用它们有助于你组合使用多种管道。

把 Nushell 想象成一种编译型语言
Nushell 设计的一个重要部分,特别是它与许多动态语言不同的地方是,Nushell 将你提供给它的源代码转换成某种可执行产物,然后再去运行它。Nushell 没有 eval 功能,因此也不允许你在运行时继续拉入新的源代码。这意味着对于诸如引入文件使其成为你项目的一部分这样的任务,需要知道文件的具体路径,就如同 C 或 Rust 等编译语言中的文件引入一样。

例如,下面的代码在 Nushell 中是没有意义的,如果作为脚本将无法执行:

echo “def abc [] { 1 2 }” | save output.nu source “output.nu” abc

source 命令将引入被编译的源码,但前面那行 save 命令还没有机会运行。Nushell 运行整个程序块就像运行一个文件一样,而不是一次运行一行。在这个例子中,由于output.nu文件是在 “编译” 步骤之后才创建的,因此 source 命令在解析时无法从其中读取定义。

另一个常见的问题是试图动态地创建文件名并source,如下:

source " ( "( "(my_path)/common.nu"

这就需要求值器(Evaluator)运行并对字符串进行求值(Evaluate),但不幸的是,Nushell 在编译时就需要这些信息。

以 Nushell 的方式思考: Nushell 被设计为对你输入的所有源代码使用一个单一的“编译”步骤,这与求值是分开的。这将允许强大的 IDE 支持,准确的错误提示,并成为第三方工具更容易使用的语言,以及在未来甚至可以有更高级的输出,比如能够直接将 Nushell 编译为二进制文件等。

变量是不可变的
对于来自其他语言的人来说,另一个常见的令人惊愕之处是 Nushell 的变量是不可变的(事实上,有些人已经开始称它们为 “常量” 来反映这一点)。接触 Nushell,你需要花一些时间来熟悉更多的函数式风格,因为这往往有助于写出与不可变的变量最相容的代码。

你可能想知道为什么 Nushell 使用不可变的变量,在 Nushell 开发的早期,我们决定看看我们能在语言中使用多长时间的以数据为中心的函数式风格。最近,我们在 Nushell 中加入了一个关键的功能,使这些早期的实验显示出其价值:并行性。通过在任何 Nushell 脚本中将each切换到par-each,你就能够在 “输入” 上并行地运行相应的代码块。这是可能的,因为 Nushell 的设计在很大程度上依赖于不可变性、组合和流水线。

Nushell 的变量是不可变的,但这并不意味着无法表达变化。Nushell 大量使用了 “Shadowing” 技术(变量隐藏)。变量隐藏是指创建一个与之前声明的变量同名的新变量,例如,假设你有一个 x 在 当 前 作 用 域 内 , 而 你 想 要 一 个 新 的 x在当前作用域内,而你想要一个新的 xx并将其加 1:

let x = $x 1

这个新的x对任何跟在这一行后面的代码都是可见的。谨慎地使用变量隐藏可以使变量的使用变得更容易,尽管这不是必须的。

循环计数器是可变变量的另一种常见模式,它被内置于大多数迭代命令中,例如,你可以使用each上的-n标志同时获得每个元素的值和索引:

ls | each -n { |it| " N u m b e r ( "Number ( "Number(it.index) is size ($it.item.size)" }

你也可以使用reduce命令来达到上述目的,其方式与你在循环中修改一个变量相同。例如,如果你想在一个字符串列表中找到最长的字符串,你可以这样做:

[one, two, three, four, five, six] | reduce {|curr, max|
if ( c u r r ∣ s t r l e n g t h ) > ( curr | str length) > ( currstrlength)>(max | str length) {
$curr
} else {
$max
}
}

以 Nushell 的方式思考: 如果你习惯于使用可变的变量来完成不同的任务,那么你将需要一些时间来学习如何以更加函数式的方式来完成每个任务。Nushell 有一套内置的能力来帮助处理这样的模式,学习它们将帮助你以更加 Nushell 的风格来写代码。由此带来的额外的好处是你可以通过并行运行你的部分代码来加速脚本执行。

Nushell 的环境是有作用域的
Nushell 从编译型语言中获得了很多设计灵感,其中一个是语言应该避免全局可变状态。Shell 经常通过修改全局变量来更新环境,但 Nushell 避开了这种方法。

在 Nushell 中,代码块可以控制自己的环境,因此对环境的改变是发生在代码块范围内的。

在实践中,这可以让你用更简洁的代码来处理子目录,例如,如果你想在当前目录下构建每个子项目,你可以运行:

ls | each { |it|
cd $it.name
make
}

cd命令改变了PWD环境变量,这个变量的改变只在当前代码块有效,如此即可允许每次迭代都从当前目录开始,进入下一个子目录。

环境变量具有作用域使命令更可预测,更容易阅读,必要时也更容易调试。Nushell 还提供了一些辅助命令,如def-env、load-env,作为对环境变量进行批量更新的辅助方法。

这里有一个例外,def-env允许你创建一个可以修改并保留调用者环境的命令。

以 Nushell 的方式思考: 在 Nushell 中,没有全局可修改变量的编码最佳实践延伸到了环境变量。使用内置的辅助命令可以让你更容易地处理 Nushell 中的环境变量问题。利用环境变量对代码块具有作用范围这一事实,也可以帮助你写出更简洁的脚本,并与外部命令互动,而不需要在全局环境中添加你不需要的东西。

插件
Nu 可以通过插件进行扩展。插件的行为与 Nu 的内置命令很相似,另外的好处是它们可以与 Nu 本身分开添加。

Nu 的插件是可执行的;Nu 在需要时启动它们,并通过 stdin, stdout 和 stderr插件 - 图1 (opens new window) 与它们进行通信。Nu 的插件可以使用 JSON 或 Cap’n Proto插件 - 图2 (opens new window) 作为它们的通信编码方式。

添加一个插件
要添加一个插件,请调用register命令来告诉 Nu 在哪里可以找到它,与此同时,你还需要告诉 Nushell 这个插件使用什么方式进行编码。

Linux macOS:

register --encoding=capnp ./my_plugins/my-cool-plugin

Windows:

register --encoding=capnp .\my_plugins\my-cool-plugin.exe

当 register 被调用时:

Nu 启动该插件并通过 stdin 向其发送 “签名” 信息;
插件通过 stdout 响应,包含其签名(名称、描述、参数、标志等)的消息;
Nu 将插件的签名保存在$nu.plugin-path位置的文件中,因此在注册之后的多次启动中都是有效的;
一旦注册,该插件就可以作为你的命令集的一部分被使用:

help commands | where is_plugin == true

示例
Nu 的主版本中包含了一些插件的例子,这些例子对学习插件协议的工作方式很有帮助:
https://github.com/nushell/nushell/tree/main/crates/nu_plugin_example

调试
调试插件的最简单方法是打印到 stderr;插件的标准错误流会通过 Nu 重定向并显示给用户。

帮助
Nu 的插件文档尚在撰写中,如果你对某件事情不确定 Nu Discord插件上的 #plugins 频道是一个提问的好地方!

最后附上nushell地址:

https://github.com/nushell/nushell

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgaehhe
系列文章
更多 icon
同类精品
更多 icon
继续加载