From 6314e1cde46332fa40afcb43365d1284c7b6666e Mon Sep 17 00:00:00 2001 From: CAESIUS_TIM <60285058+CAESIUS-TIM@users.noreply.github.com> Date: Sun, 10 Dec 2023 19:20:11 +0800 Subject: [PATCH] =?UTF-8?q?[zh-CN]=20Update=20README,=20and=20Getting=20St?= =?UTF-8?q?arted=20(=E5=85=A5=E9=97=A8=E7=AF=87)=20(#1168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `zh-CN/README.md` - `zh-CN/book/README.md` - `zh-CN/book/installation.md` - `zh-CN/book/thinking_in_nu.md` - `zh-CN/book/moving_around.md` Guide: [*Chinese Copywriting Guidelines*](https://github.com/sparanoid/chinese-copywriting-guidelines) Formatter: [autocorrect](https://github.com/huacnlee/autocorrect) --- zh-CN/README.md | 8 ++-- zh-CN/book/README.md | 40 +++++++++--------- zh-CN/book/installation.md | 60 ++++++++++++++------------- zh-CN/book/moving_around.md | 30 ++++++++++---- zh-CN/book/thinking_in_nu.md | 80 +++++++++++++++++++++++++----------- 5 files changed, 135 insertions(+), 83 deletions(-) diff --git a/zh-CN/README.md b/zh-CN/README.md index 7fc6a3281af..a229eff92eb 100755 --- a/zh-CN/README.md +++ b/zh-CN/README.md @@ -30,20 +30,22 @@ Nu 在类型化的数据上操作,所以它能捕捉到其他 Shell 无法捕 ## 获取 Nu -Nushell 可以通过 [你喜欢的软件包管理器](https://repology.org/project/nushell/versions) 来安装 [可下载的二进制文件](https://github.com/nushell/nushell/releases),可以在 [GitHub Action](https://github.com/marketplace/actions/setup-nu) 中使用,此外也可以以 [源码](https://github.com/nushell/nushell)方式获得。在此阅读 [详细的安装说明](/zh-CN/book/installation.md)或直接开始: +Nushell 可以通过 [你喜欢的软件包管理器](https://repology.org/project/nushell/versions) 来安装 [可下载的二进制文件](https://github.com/nushell/nushell/releases),可以在 [GitHub Action](https://github.com/marketplace/actions/setup-nu) 中使用,此外也可以以 [源码](https://github.com/nushell/nushell)方式获得。在此阅读 [详细的安装说明](/zh-CN/book/installation.md) 或直接开始: #### macOS / Linux: -```sh +```shell $ brew install nushell ``` #### Windows: -```powershell +```shell $ winget install nushell ``` +完成安装后,输入 `nu` 来启动 Nu。 + ## 社区 如果你有任何问题可以在 [Dicord](https://discord.gg/NtAbbGn) 上找到我们。 diff --git a/zh-CN/book/README.md b/zh-CN/book/README.md index f376dfecba7..efc2afe6bc2 100644 --- a/zh-CN/book/README.md +++ b/zh-CN/book/README.md @@ -1,28 +1,28 @@ # 介绍 -你好,欢迎来到 Nushell 项目。这个项目的目标是继承 Unix Shell 中用管道把简单的命令连接在一起的理念,并将其带到更具现代风格的开发中。 +你好,欢迎来到 Nushell 项目。这个项目的目标是继承 Unix Shell 中用管道把简单的命令连接在一起的理念,并将其带到更具现代风格的开发中。因此,Nushell 不是一个纯粹的 shell 或编程语言,而是通过将一种丰富的编程语言和功能齐全的 shell 结合到一个软件包中,实现了二者的连接。 -Nu 汲取了很多常见领域的灵感:传统 Shell 比如 Bash、基于对象的 Shell 比如 PowerShell、逐步类型化的语言比如 TypeScript、函数式编程、系统编程,等等。但是,Nu 并不试图成为万金油,而是把精力集中在做好这几件事上: +Nu 汲取了很多常见领域的灵感:传统 Shell 比如 Bash、基于对象的 Shell 比如 PowerShell、逐步类型化的语言比如 TypeScript、函数式编程、系统编程,等等。但是,Nu 并不试图成为万金油,而是把精力集中在做好这几件事上: - 作为一个具有现代感的灵活的跨平台 Shell; - 作为一种现代的编程语言,解决与数据有关的问题; -- 给予清晰的错误信息和干净的 IDE 支持; +- 给予清晰的错误信息和干净的 IDE 支持。 了解 Nu 能做什么的最简单的方法是从一些例子开始,所以让我们深入了解一下。 -当你运行[`ls`](/commands/docs/ls.md)这样的命令时,你会注意到的第一件事是,你得到的不是一个文本块,而是一个结构化的表格: +当你运行 [`ls`](/commands/docs/ls.md) 这样的命令时,你会注意到的第一件事是,你得到的不是一个文本块,而是一个结构化的表格: @[code](@snippets/introduction/ls_example.sh) 该表不仅仅是以不同的方式显示目录,就像电子表格中的表一样,它还允许我们以更加互动的方式来处理数据。 -我们要做的第一件事是按大小对我们的表进行排序。要做到这一点,我们将从[`ls`](/commands/docs/ls.md)中获取输出,并将其输入到一个可以根据列的内容对表进行排序的命令中: +我们要做的第一件事是按大小对我们的表进行排序。要做到这一点,我们将从 [`ls`](/commands/docs/ls.md) 中获取输出,并将其输入到一个可以根据列的内容对表进行排序的命令中: @[code](@snippets/introduction/ls_sort_by_reverse_example.sh) -你可以看到,为了达到这个目的,我们没有向[`ls`](/commands/docs/ls.md)传递命令行参数。取而代之的是,我们使用了 Nu 提供的`sort-by`命令来对[`ls`](/commands/docs/ls.md)命令的输出进行排序。为了在顶部看到最大的文件,我们还使用了[`reverse`](/commands/docs/reverse.md)命令。 +你可以看到,为了达到这个目的,我们没有向 [`ls`](/commands/docs/ls.md) 传递命令行参数。取而代之的是,我们使用了 Nu 提供的 [`sort-by`](/commands/docs/sort-by.md) 命令来对 [`ls`](/commands/docs/ls.md) 命令的输出进行排序。为了在顶部看到最大的文件,我们还使用了 [`reverse`](/commands/docs/reverse.md) 命令。 -Nu 提供了许多可以对表进行操作的命令,例如,我们可以过滤[`ls`](/commands/docs/ls.md)表的内容,使其只显示超过 1 千字节的文件。 +Nu 提供了许多可以对表进行操作的命令,例如,我们可以过滤 [`ls`](/commands/docs/ls.md) 表的内容,使其只显示超过 1 千字节的文件。 @[code](@snippets/introduction/ls_where_example.sh) @@ -30,46 +30,46 @@ Nu 提供了许多可以对表进行操作的命令,例如,我们可以过 @[code](@snippets/introduction/ps_example.sh) -如果你使用过 Linux,你可能对[`ps`](/commands/docs/ps.md)命令很熟悉。通过它,我们可以得到一个当前系统正在运行的所有进程的列表,它们的状态是什么,以及它们的名字是什么,我们还可以看到这些进程的 CPU 负载。 +如果你使用过 Linux,你可能对 [`ps`](/commands/docs/ps.md) 命令很熟悉。通过它,我们可以得到一个当前系统正在运行的所有进程的列表,它们的状态是什么,以及它们的名字是什么,我们还可以看到这些进程的 CPU 负载。 -如果我们想显示那些正在活跃使用 CPU 的进程呢?就像我们之前对[`ls`](/commands/docs/ls.md)命令所做的那样,我们也可以利用[`ps`](/commands/docs/ps.md)命令返回给我们的表格来做到: +如果我们想显示那些正在活跃使用 CPU 的进程呢?就像我们之前对 [`ls`](/commands/docs/ls.md) 命令所做的那样,我们也可以利用 [`ps`](/commands/docs/ps.md) 命令返回给我们的表格来做到: @[code](@snippets/introduction/ps_where_example.sh) -到目前为止,我们一直在使用[`ls`](/commands/docs/ls.md)和[`ps`](/commands/docs/ps.md)来列出文件和进程。Nu 还提供了其他可以创建有用信息表格的命令。接下来,让我们试一下[`date`](/commands/docs/date.md)和[`sys`](/commands/docs/sys.md)。 +到目前为止,我们一直在使用 [`ls`](/commands/docs/ls.md) 和 [`ps`](/commands/docs/ps.md) 来列出文件和进程。Nu 还提供了其他可以创建有用信息表格的命令。接下来,让我们试一下 [`date`](/commands/docs/date.md) 和 [`sys`](/commands/docs/sys.md)。 -运行`date now`输出关于当前日期和时间的信息: +运行 [`date now`](/commands/docs/date_now.md) 输出关于当前日期和时间的信息: @[code](@snippets/introduction/date_example.sh) -为了将获得的日期以表格形式展示,我们可以把它输入到 `date to-table`中: +为了将获得的日期以表格形式展示,我们可以把它输入到 [`date to-table`](/commands/docs/date_to-table.md) 中: @[code](@snippets/introduction/date_table_example.sh) -运行[`sys`](/commands/docs/sys.md)可以得到 Nu 所运行的系统的信息: +运行 [`sys`](/commands/docs/sys.md) 可以得到 Nu 所运行的系统的信息: @[code](@snippets/introduction/sys_example.sh) -这与我们之前看到的表格有些不同。[`sys`](/commands/docs/sys.md)命令输出了一个在单元格中包含结构化表格而非简单值的表格。要查看这些数据,我们需要 _`get`_ 待查看的列: +这与我们之前看到的表格有些不同。[`sys`](/commands/docs/sys.md) 命令输出了一个在单元格中包含结构化表格而非简单值的表格。要查看这些数据,我们需要**获取**([`get`](/commands/docs/get.md))待查看的列: @[code](@snippets/introduction/sys_get_example.sh) -[`get`](/commands/docs/get.md)命令让我们深入表的某一列内容中。在这里,我们要查看的是 "host" 列,它包含了 Nu 正在运行的主机的信息:操作系统名称、主机名、CPU,以及更多。让我们来获取系统上的用户名: +[`get`](/commands/docs/get.md) 命令让我们深入表的某一列内容中。在这里,我们要查看的是 `host` 列,它包含了 Nu 正在运行的主机的信息:操作系统名称、主机名、CPU,以及更多。让我们来获取系统上的用户名: @[code](@snippets/introduction/sys_get_nested_example.sh) -现在,系统中只有一个名为 "jt" 的用户。你会注意到,我们可以传递一个列路径(`host.sessions.name`部分),而不仅仅是简单的列名称。Nu 会接受列路径并输出表中相应的数据。 +现在,系统中只有一个名为 jt 的用户。你会注意到,我们可以传递一个列路径(`host.sessions.name` 部分),而不仅仅是简单的列名称。Nu 会接受列路径并输出表中相应的数据。 -你可能已经注意到其他一些不同之处:我们没有一个数据表,而只有一个元素:即字符串 "jt"。Nu 既能处理数据表,也能处理字符串。字符串是使用 Nu 外部命令的一个重要部分。 +你可能已经注意到其他一些不同之处:我们没有一个数据表,而只有一个元素:即字符串 `"jt"`。Nu 既能处理数据表,也能处理字符串。字符串是使用 Nu 外部命令的一个重要部分。 -让我们看看字符串在 Nu 外部命令里面是如何工作的。我们以之前的例子为例,运行外部的`echo`命令(`^`告诉 Nu 不要使用内置的[`echo`](/commands/docs/echo.md)命令): +让我们看看字符串在 Nu 外部命令里面是如何工作的。我们以之前的例子为例,运行外部的 `echo` 命令(`^` 告诉 Nu 不要使用内置的 [`echo`](/commands/docs/echo.md) 命令): @[code](@snippets/introduction/sys_get_external_echo_example.sh) -敏锐的读者可能会发现这看起来和我们之前的非常相似!确实如此,但有一个重要的区别:我们用前面的值调用了`^echo`。这允许我们把数据从 Nu 中传到外部命令`echo`(或者 Nu 之外的任何命令,比如`git`)。 +敏锐的读者可能会发现这看起来和我们之前的非常相似!确实如此,但有一个重要的区别:我们用前面的值调用了 `^echo`。这允许我们把数据从 Nu 中传到外部命令 `echo`(或者 Nu 之外的任何命令,比如 `git`)。 ### 获取帮助 -任何 Nu 的内置命令的帮助文本都可以通过[`help`](/commands/docs/help.md)命令来找到。要查看所有命令,请运行`help commands`。你也可以通过执行`help -f `来搜索一个主题: +任何 Nu 的内置命令的帮助文本都可以通过 [`help`](/commands/docs/help.md) 命令来找到。要查看所有命令,请运行 `help commands` 。你也可以通过执行 `help -f ` 来搜索一个主题: @[code](@snippets/introduction/help_example.sh) diff --git a/zh-CN/book/installation.md b/zh-CN/book/installation.md index 36ec76ad8a5..48a573eb36a 100644 --- a/zh-CN/book/installation.md +++ b/zh-CN/book/installation.md @@ -1,10 +1,14 @@ # 安装 Nu -有很多方法可以获取并使用 Nu。你可以从我们的[发布页面](https://github.com/nushell/nushell/releases)下载预编译的二进制文件,也可以 [使用你喜欢的软件包管理器](https://repology.org/project/nushell/versions),或者从源码构建。 +有很多方法可以获取并使用 Nu。你可以从我们的 [发布页面](https://github.com/nushell/nushell/releases) 下载预编译的二进制文件,也可以 [使用你喜欢的软件包管理器](https://repology.org/project/nushell/versions),或者从源码构建。 + +Nushell 的主要二进制文件被命名为 `nu`(或 Windows 下的 `nu.exe`)。安装完成后你可以通过输入 `nu` 来启动它: + +@[code](@snippets/installation/run_nu.sh) ## 预编译二进制包 -Nu 二进制文件在 [GitHub 的 Release 页](https://github.com/nushell/nushell/releases)发布,适用于 Linux、macOS 和 Windows。只需下载并解压二进制文件,然后将其复制到你的系统`PATH`上的某个位置即可。 +Nu 二进制文件在 [GitHub 的 Release 页](https://github.com/nushell/nushell/releases) 发布,适用于 Linux、macOS 和 Windows。只需下载并解压二进制文件,然后将其复制到你的系统 `PATH` 上的某个位置即可。 ## 软件包管理器 @@ -12,7 +16,7 @@ Nu 可以通过几个软件包管理器获得: [![打包状态](https://repology.org/badge/vertical-allrepos/nushell.svg)](https://repology.org/project/nushell/versions) -对于 macOS 和 Linux,[Homebrew](https://brew.sh/)是一个流行的选择(`brew install nushell`)。 +对于 macOS 和 Linux,[Homebrew](https://brew.sh/) 是一个流行的选择(`brew install nushell`)。 对于 Windows 用户: @@ -20,33 +24,35 @@ Nu 可以通过几个软件包管理器获得: - [Chocolatey](https://chocolatey.org/) (`choco install nushell`) - [Scoop](https://scoop.sh/) (`scoop install nu`) -Nushell 的主要二进制文件被命名为 `nu`(或 Windows 下的 `nu.exe`)。安装完成后你可以通过输入 `nu` 来启动它。 +跨平台安装: + +- [npm](https://www.npmjs.com/) (`npm install -g nushell` 请注意,以这种方式安装,nu 插件是不包含在内的) ## 从源码构建 -你也可以从源代码构建`Nu`。首先,你需要设置 Rust 工具链和它的依赖项。 +你也可以从源代码构建 `Nu`。首先,你需要设置 Rust 工具链和它的依赖项。 ### 安装编译器套件 为了使 Rust 能够正常工作,你需要在你的系统上安装一个兼容的编译器套件。以下是推荐的编译器套件: - Linux:GCC 或 Clang -- macOS:Clang (安装 Xcode) +- macOS:Clang(安装 Xcode) - Windows:MSVC(安装 [Visual Studio](https://visualstudio.microsoft.com/vs/community/) 或 [Visual Studio Build Tools](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022)) - - 请确保安装 "用 C++进行桌面开发" 相关包 - - 任何 Visual Studio 版本都可以(社区版是免费的) + - 请确保安装 "用 C++ 进行桌面开发" 相关包 + - 任何 Visual Studio 版本都可以(社区版是免费的) ### 安装 Rust 如果我们的系统中还没有 Rust,最好的方法是通过 [rustup](https://rustup.rs/) 来安装它。Rustup 是一种管理 Rust 安装的工具,可以管理使用不同的 Rust 版本。 -Nu 目前需要 **最新(1.60 或更高)的稳定** 版本的 Rust。最好的方法是让`rustup`为你找到正确的版本。当你第一次打开`rustup`时,它会询问你想安装哪个版本的 Rust: +Nu 目前需要 **最新(1.66.1 或更高)的稳定** 版本的 Rust。最好的方法是让 `rustup` 为你找到正确的版本。当你第一次打开 `rustup` 时,它会询问你想安装哪个版本的 Rust: @[code](@snippets/installation/rustup_choose_rust_version.sh) 一旦我们准备好了,我们就按 `1`,然后回车。 -如果你不愿意通过`rustup`来安装 Rust,你也可以通过其他方法来安装它(比如从 Linux 发行版的软件包中)。只要确保安装 1.60 或更高版本的 Rust 即可。 +如果你不愿意通过 `rustup` 来安装 Rust,你也可以通过其他方法来安装它(比如从 Linux 发行版的软件包中)。只要确保安装 1.66.1 或更高版本的 Rust 即可。 ### 依赖 @@ -72,22 +78,18 @@ Nu 目前需要 **最新(1.60 或更高)的稳定** 版本的 Rust。最好 @[code](@snippets/installation/macos_deps.sh) -### 使用 [crates.io](https://crates.io)进行构建 +### 使用 [crates.io](https://crates.io) 进行构建 -Nu 发行版会作为源码发布到流行的 Rust 包仓库 [crates.io](https://crates.io/),这使得使用 `cargo` 构建并安装最新的 Nu 版本变得很容易: +Nu 发行版会作为源码发布到流行的 Rust 包仓库 [crates.io](https://crates.io/)。这使得使用 `cargo` 构建并安装最新的 Nu 版本变得很容易: @[code](@snippets/installation/cargo_install_nu.sh) -如此即可! `cargo`工具将完成下载 Nu 及其源码依赖,构建并将其安装到 cargo bin 路径中,以便我们能够运行它。 +如此即可!`cargo` 工具将完成下载 Nu 及其源码依赖,构建并将其安装到 cargo bin 路径中,以便我们能够运行它。 -如果你想安装更多的功能,你可以使用: +如果你想要安装并支持 [dataframes](/zh-CN/book/dataframes.md) 功能,你可以在安装命令附上 `--features=dataframe`: @[code](@snippets/installation/cargo_install_nu_more_features.sh) -安装完毕后,我们可以使用 `nu` 命令运行 Nu: - -@[code](@snippets/installation/run_nu.sh) - ### 从 GitHub 仓库构建 我们也可以从 GitHub 上的最新源码构建自己的 Nu。这让我们可以立即获得最新的功能和错误修复。首先,克隆源码仓库: @@ -98,31 +100,31 @@ Nu 发行版会作为源码发布到流行的 Rust 包仓库 [crates.io](https:/ @[code](@snippets/installation/build_nu_from_source.sh) -你也可以在**发布**模式下构建和运行 Nu: +你也可以在**发布**模式下构建和运行 Nu,以获得更多的编译优化: @[code](@snippets/installation/build_nu_from_source_release.sh) -熟悉 Rust 的人可能会问,如果 "run" 默认会构建,为什么我们还要做 "build" 和 "run" 这两个步骤?这是为了解决 Cargo 中新的 `default-run` 选项的缺陷,并确保所有插件都被构建,尽管这在将来可能不再需要。 +熟悉 Rust 的人可能会问,如果 `run` 默认会构建,为什么我们还要做 `build` 和 `run` 这两个步骤?这是为了解决 Cargo 中新的 `default-run` 选项的缺陷,并确保所有插件都被构建,尽管这在将来可能不再需要。 -## 设置登录 Shell (\*nix) +## 设置登录 Shell(\*nix) -**!!! Nu 仍在开发中,对于日常使用可能并不稳定。!!!** +:::danger +Nu 仍在开发中,对于日常使用可能并不稳定! +::: -要设置登录 Shell,你可以使用[`chsh`](https://linux.die.net/man/1/chsh)命令。 -一些 Linux 发行版有一个位于`/etc/shells`的有效 Shell 列表,在 Nu 被列入白名单之前不允许改变 Shell。如果你没有更新`shells`文件,你可能会看到类似于下面的错误: +要设置登录 Shell,你可以使用 [`chsh`](https://linux.die.net/man/1/chsh) 命令。一些 Linux 发行版有一个位于 `/etc/shells` 的有效 Shell 列表,在 Nu 被列入白名单之前不允许改变 Shell。如果你没有更新 `shells` 文件,你可能会看到类似于下面的错误: @[code](@snippets/installation/chsh_invalid_shell_error.sh) -你可以通过在`shells`文件中添加你的 Nu 二进制文件来把 Nu 添加到允许的 Shells 列表中。 -添加的路径可以用`which nu`命令找到,通常是`$HOME/.cargo/bin/nu`。 +你可以通过在 `shells` 文件中添加你的 Nu 二进制文件来把 Nu 添加到允许的 Shells 列表中。添加的路径可以用 `which nu` 命令找到,通常是 `$HOME/.cargo/bin/nu`。 -## 设置默认的 Shell (Windows 终端) +## 设置默认的 Shell(Windows 终端) -如果你使用的是 [Windows Terminal](https://github.com/microsoft/terminal),你可以通过添加如下内容到你的终端设置`"profiles"`(JSON 文件)中来设置`nu`作为你的默认 Shell: +如果你使用的是 [Windows Terminal](https://github.com/microsoft/terminal),你可以通过添加如下内容到你的终端设置 `"profiles"`(JSON 文件)中来设置 `nu` 作为你的默认 Shell: @[code](@snippets/installation/windows_terminal_default_shell.sh) -最后需要做的是将 `"defaultProfile"` 改为: +最后需要做的是将 `"defaultProfile"` 改为: @[code](@snippets/installation/windows_change_default_profile.sh) diff --git a/zh-CN/book/moving_around.md b/zh-CN/book/moving_around.md index 95f301324bb..dd9d590dcb4 100644 --- a/zh-CN/book/moving_around.md +++ b/zh-CN/book/moving_around.md @@ -6,31 +6,41 @@ @[code](@snippets/moving_around/ls_example.sh) -正如我们在其他章节中所看到的,[`ls`](/commands/docs/ls.md)是一个用于查看路径内容的命令。Nu 将以表格的形式返回内容并供我们使用。 +正如我们在其他章节中所看到的,[`ls`](/commands/docs/ls.md) 是一个用于查看路径内容的命令。Nu 将以表格的形式返回内容并供我们使用。 -[`ls`](/commands/docs/ls.md)命令还需要一个可选的参数,以改变你想查看的内容。例如,我们可以列出以 ".md " 结尾的文件: +[`ls`](/commands/docs/ls.md) 命令还需要一个可选的参数,以改变你想查看的内容。例如,我们可以列出以 `.md` 结尾的文件: @[code](@snippets/moving_around/ls_shallow_glob_example.sh) -上述可选参数 "**\*.md**" 中的星号(\*)有时被称为通配符或 Glob,它让我们可以匹配任何东西。你可以把 glob "\*.md" 理解为 "匹配以 '.md' 结尾的任何文件名" +## 通配符 -Nu 也使用现代 Globs,它允许你访问更深的目录: +上述可选参数 `*.md` 中的星号(\*)有时被称为通配符(wildcards)或 Glob,它让我们可以匹配任何东西。你可以把 glob `*.md` 理解为“匹配以 `.md` 结尾的任何文件名”。 + +最通用的通配符是 `*`,能够匹配所有路径。它经常和其他模式(pattern)组合使用,比如 `*.bak` 和 `temp*`。 + +Nu 也使用现代 Globs,它允许你访问更深的目录。比如,`ls **/*.md` 将递归地罗列当前目录下、所有后缀为 `.md` 的非隐藏文件: @[code](@snippets/moving_around/ls_deep_glob_example.sh) -在这里,我们要寻找任何以".md" 结尾的文件,两个星号进一步表示 "从这里开始的任何目录中"。 +- `**` 表示“从这里开始的任何目录中”; +- `*.md` 表示“任意后缀为 `.md` 的文件名”(不包括隐藏文件,要额外添加 `--all, -a` 选项); +- 除了 `*`,还有 `?` 用来匹配单个字符。比如,可以使用 `p???` 模式匹配 `port` 字符串。 + +结合 [字符串的处理](/zh-CN/book/working_with_strings.md) 能够写出更强大的模式。但是,请牢记 Nu 类似一种 [编译型语言](/zh-CN/book/thinking_in_nu.md#把-nushell-想象成一种编译型语言)。 ## 改变当前目录 @[code](@snippets/moving_around/cd_example.sh) -要从当前目录换到一个新目录,我们使用 [`cd`](/commands/docs/cd.md) 命令。就像在其他 Shells 中一样,我们可以使用目录的名称,或者如果我们想进入父目录,我们可以使用`..`的快捷方式。 +要从当前目录换到一个新目录,我们使用 [`cd`](/commands/docs/cd.md) 命令。就像在其他 Shells 中一样,我们可以使用目录的名称,或者如果我们想进入父目录,我们可以使用 `..` 的快捷方式。 如果 [`cd`](/commands/docs/cd.md) 被省略,只给出一个路径本身,也可以改变当前工作目录: @[code](@snippets/moving_around/cd_without_command_example.sh) -**注意:** 用 [`cd`](/commands/docs/cd.md) 改变目录会改变`PWD`环境变量。这意味着目录的改变会保留到当前代码块中,一旦你退出这个代码块,你就会返回到以前的目录。你可以在 [环境篇](environment.md) 中了解更多关于这方面的信息。 +:::warning +用 [`cd`](/commands/docs/cd.md) 改变目录会改变 `PWD` 环境变量。这意味着目录的改变会保留到当前代码块中,一旦你退出这个代码块,你就会返回到以前的目录。你可以在 [环境篇](environment.md) 中了解更多关于这方面的信息。 +::: ## 文件系统命令 @@ -44,11 +54,15 @@ Nu 还提供了一些基本的文件系统命令,并且可以跨平台工作 @[code](@snippets/moving_around/cp_example.sh) +:::danger +`cp` 在 Windows 系统,即使目标文件存在,命令也没有附加 `--force, -f`,目标文件仍会被覆盖! +::: + 我们也可以通过 [`rm`](/commands/docs/rm.md) 命令删除一个目录或文件: @[code](@snippets/moving_around/rm_example.sh) -这三个命令也可以使用我们先前看到的[`ls`](/commands/docs/ls.md)的 Glob 功能。 +这三个命令也可以使用我们先前看到的 [`ls`](/commands/docs/ls.md) 的 Glob 功能。 最后,我们可以使用 [`mkdir`](/commands/docs/mkdir.md) 命令创建一个新目录: diff --git a/zh-CN/book/thinking_in_nu.md b/zh-CN/book/thinking_in_nu.md index 36645cc21ea..6a5e46db667 100644 --- a/zh-CN/book/thinking_in_nu.md +++ b/zh-CN/book/thinking_in_nu.md @@ -1,78 +1,110 @@ # 以 Nushell 的方式思考 -为了帮助你理解并充分利用 Nushell,我们把这部分内容一起放入"以 Nushell 的方式思考"这一节。通过学习 Nushell 的思考方式,并使用它提供的模式,你会在开始时遇到更少的问题,并为接下来的成功做好准备。 +为了帮助你理解并充分利用 Nushell,我们把这部分内容一起放入“以 Nushell 的方式思考”这一节。通过学习 Nushell 的思考方式,并使用它提供的模式,你会在开始时遇到更少的问题,并为接下来的成功做好准备。 那么,用 Nushell 的方式思考是什么意思呢?下面是一些 Nushell 新用户常见的问题。 ## Nushell 不是 Bash -Nushell 既是一种编程语言,也是一种 Shell,正因为如此,它有自己的方式来处理文件、目录、网站等等。我们对其进行了建模,以使其与你可能熟悉的其他 Shell 的工作方式接近。其中管道用于将两个命令连接在一起: +Nushell 既是一种编程语言,也是一种 Shell。正因为如此,它有自己的方式来处理文件、目录、网站等等。我们对其进行了建模,以使其与你可能熟悉的其他 Shell 的工作方式接近。其中管道用于将两个命令连接在一起: ```nu > ls | length ``` -Nushell 也支持其他常见的功能,例如从之前运行的命令中获取退出代码(Exit Code)。 +Nushell 也支持其他常见的功能,例如从之前运行的命令中获取退出代码(Exit Code)。 虽然它确实有这些功能,但 Nushell 并不是 Bash。Bash 的工作方式以及一般的 POSIX 风格,并不是 Nushell 所支持的。例如,在 Bash 中你可以使用: -```nu +```shell > echo "hello" > output.txt ``` -在 Nushell 中,我们使用`>`作为大于运算符,这与 Nushell 的语言特质比较吻合。取而代之的是,你需要用管道将其连接到一个可以保存内容的命令: +在 Nushell 中,我们使用 `>` 作为大于运算符,这与 Nushell 的语言特质比较吻合。取而代之的是,你需要用管道将其连接到一个可以保存内容的命令: ```nu -> echo "hello" | save output.txt +> "hello" | save output.txt ``` -**以 Nushell 的方式思考:** Nushell 看待数据的方式是,数据在管道中流动,直到它到达用户或由最后的命令处理。Nushell 使用命令来完成工作,学习这些命令以及何时使用它们有助于你组合使用多种管道。 +**以 Nushell 的方式思考:** Nushell 看待数据的方式是,数据在管道中流动,直到它到达用户或由最后的命令处理。你可以简单地输入数据,从字符串到类似 JSON 的列表和记录,然后使用 `|` 将其通过管道发送。Nushell 使用命令来执行工作并生成更多数据。学习这些命令以及何时使用它们有助于你组合使用多种管道。 ## 把 Nushell 想象成一种编译型语言 -Nushell 设计的一个重要部分,特别是它与许多动态语言不同的地方是,Nushell 将你提供给它的源代码转换成某种可执行产物,然后再去运行它。Nushell 没有 `eval` 功能,因此也不允许你在运行时继续拉入新的源代码。这意味着对于诸如引入文件使其成为你项目的一部分这样的任务,需要知道文件的具体路径,就如同 C++或 Rust 等编译语言中的文件引入一样。 +Nushell 设计的一个重要部分,特别是它与许多动态语言不同的地方是,Nushell 将你提供给它的源代码转换成某种可执行产物,然后再去运行它。Nushell 没有 `eval` 功能,因此也不允许你在运行时继续拉入新的源代码。这意味着对于诸如引入文件使其成为你项目的一部分这样的任务,需要知道文件的具体路径,就如同 C++ 或 Rust 等编译语言中的文件引入一样。 -例如,下面的代码在 Nushell 中是没有意义的,如果作为脚本将无法执行: +例如,下面的代码作为 **[脚本](/zh-CN/book/scripts.md)** 将无法执行(当然,在**交互式模式**里一句句运行是可以的): ```nu -echo "def abc [] { 1 + 2 }" | save output.nu +# compiled.nu +"def abc [] { 1 + 2 }" | save output.nu +sleep 1sec # 延时 1 秒,但是并没有作用,因为是整体编译的。 source "output.nu" abc ``` -`source` 命令将引入被编译的源码,但前面那行 `save` 命令还没有机会运行。Nushell 运行整个程序块就像运行一个文件一样,而不是一次运行一行。在这个例子中,由于`output.nu`文件是在 "编译" 步骤之后才创建的,因此 `source` 命令在解析时无法从其中读取定义。 +```nu +> nu compiled.nu +Error: nu::parser::sourced_file_not_found + + × File not found + ╭─[.../compiled.nu:2:1] + 2 │ sleep 1sec + 3 │ source "output.nu" + · ─────┬───── + · ╰── File not found: output.nu + 4 │ abc + ╰──── + help: sourced files need to be available before your script is run +``` + +但是,以 [组](types_of_data.html#组) 的方式在**交互式模式**中运行就又和脚本一样了: + +```nu +> "def abc [] { 1 + 2 }" | save output.nu; sleep 1sec; source "output.nu"; abc +Error: nu::parser::sourced_file_not_found + + × File not found + ╭─[entry #1:1:1] + 1 │ "def abc [] { 1 + 2 }" | save output.nu; sleep 1sec; source "output.nu"; abc + · ─────┬───── + · ╰── File not found: output.nu + ╰──── + help: sourced files need to be available before your script is run +``` + +`source` 命令将引入被编译的源码,但前面那行 `save` 命令还没有机会运行。Nushell 运行整个程序块就像运行一个文件一样,而不是一次运行一行。在这个例子中,由于 `output.nu` 文件是在“编译”步骤之后才创建的,因此 `source` 命令在解析时无法从其中读取定义。 -另一个常见的问题是试图动态地创建文件名并`source`,如下: +另一个常见的问题是试图动态地创建文件名并 `source`,如下: ```nu > source $"($my_path)/common.nu" ``` -这就需要求值器(Evaluator)运行并对字符串进行求值(Evaluate),但不幸的是,Nushell 在编译时就需要这些信息。 +这就需要求值器(Evaluator)运行并对字符串进行求值(Evaluate),但不幸的是,Nushell 在编译时就需要这些信息。 **以 Nushell 的方式思考:** Nushell 被设计为对你输入的所有源代码使用一个单一的“编译”步骤,这与求值是分开的。这将允许强大的 IDE 支持,准确的错误提示,并成为第三方工具更容易使用的语言,以及在未来甚至可以有更高级的输出,比如能够直接将 Nushell 编译为二进制文件等。 ## 变量是不可变的 -对于来自其他语言的人来说,另一个常见的令人惊愕之处是 Nushell 的变量是不可变的(事实上,有些人已经开始称它们为 "**常量**" 来反映这一点)。接触 Nushell,你需要花一些时间来熟悉更多的函数式风格,因为这往往有助于写出与**不可变的变量**最相容的代码。 +对于来自其他语言的人来说(Rustaceans 除外),另一个常见的令人惊愕之处是 Nushell 的变量是不可变的(事实上,有些人已经开始称它们为“**常量**”来反映这一点)。接触 Nushell,你需要花一些时间来熟悉更多的函数式风格,因为这往往有助于写出与**不可变的变量**最相容的代码。 -你可能想知道为什么 Nushell 使用不可变的变量,在 Nushell 开发的早期,我们决定看看我们能在语言中使用多长时间的以数据为中心的函数式风格。最近,我们在 Nushell 中加入了一个关键的功能,使这些早期的实验显示出其价值:并行性。通过在任何 Nushell 脚本中将[`each`](/commands/docs/each.md)切换到[`par-each`](/commands/docs/par-each.md),你就能够在 “输入” 上并行地运行相应的代码块。这是可能的,因为 Nushell 的设计在很大程度上依赖于不可变性、组合和流水线。 +你可能想知道为什么 Nushell 使用不可变的变量,在 Nushell 开发的早期,我们决定看看我们能在语言中使用多长时间的以数据为中心的函数式风格。最近,我们在 Nushell 中加入了一个关键的功能,使这些早期的实验显示出其价值:并行性。通过在任何 Nushell 脚本中将 [`each`](/commands/docs/each.md) 切换到 [`par-each`](/commands/docs/par-each.md) ,你就能够在“输入”上并行地运行相应的代码块。这是可能的,因为 Nushell 的设计在很大程度上依赖于不可变性、组合和流水线。 -Nushell 的变量是不可变的,但这并不意味着无法表达变化。Nushell 大量使用了 "Shadowing" 技术(变量隐藏)。变量隐藏是指创建一个与之前声明的变量同名的新变量,例如,假设你有一个`$x`在当前作用域内,而你想要一个新的`$x`并将其加 1: +Nushell 的变量是不可变的,但这并不意味着无法表达变化。Nushell 大量使用了 "Shadowing" 技术(变量隐藏)。变量隐藏是指创建一个与之前声明的变量同名的新变量。例如,假设你有一个 `$x` 在当前作用域内,而你想要一个新的 `$x` 并将其加 1: ```nu let x = $x + 1 ``` -这个新的`x`对任何跟在这一行后面的代码都是可见的。谨慎地使用变量隐藏可以使变量的使用变得更容易,尽管这不是必须的。 +这个新的 `x` 对任何跟在这一行后面的代码都是可见的。谨慎地使用变量隐藏可以使变量的使用变得更容易,尽管这不是必须的。 -循环计数器是可变变量的另一种常见模式,它被内置于大多数迭代命令中,例如,你可以使用[`each`](/commands/docs/each.md)上的`-n`标志同时获得每个元素的值和索引: +循环计数器是可变变量的另一种常见模式,它被内置于大多数迭代命令中,例如,你可以使用 [`each`](/commands/docs/each.md) 上的 `-n` 标志同时获得每个元素的值和索引: ```nu > ls | enumerate | each { |it| $"Number ($it.index) is size ($it.item.size)" } ``` -你也可以使用[`reduce`](/commands/docs/reduce.md)命令来达到上述目的,其方式与你在循环中修改一个变量相同。例如,如果你想在一个字符串列表中找到最长的字符串,你可以这样做: +你也可以使用 [`reduce`](/commands/docs/reduce.md) 命令来达到上述目的,其方式与你在循环中修改一个变量相同。例如,如果你想在一个字符串列表中找到最长的字符串,你可以这样做: ```nu > [one, two, three, four, five, six] | reduce {|curr, max| @@ -101,10 +133,12 @@ Nushell 从编译型语言中获得了很多设计灵感,其中一个是语言 } ``` -`cd`命令改变了`PWD`环境变量,这个变量的改变只在当前代码块有效,如此即可允许每次迭代都从当前目录开始,进入下一个子目录。 +`cd` 命令改变了 `PWD` 环境变量,这个变量的改变只在当前代码块有效,如此即可允许每次迭代都从当前目录开始,进入下一个子目录。 -环境变量具有作用域使命令更可预测,更容易阅读,必要时也更容易调试。Nushell 还提供了一些辅助命令,如[`def --env`](/commands/docs/def.md)、[`load-env`](/commands/docs/load-env.md),作为对环境变量进行批量更新的辅助方法。 +环境变量具有作用域使命令更可预测,更容易阅读,必要时也更容易调试。Nushell 还提供了一些辅助命令,如 [`def --env`](/commands/docs/def.md)、[`load-env`](/commands/docs/load-env.md),作为对环境变量进行批量更新的辅助方法。 -`*` - 这里有一个例外,[`def --env`](/commands/docs/def.md)允许你创建一个可以修改并保留调用者环境的命令 +:::tip +这里有一个例外,[`def --env`](/commands/docs/def.md) 允许你创建一个可以修改并保留调用者环境的命令 +::: -**以 Nushell 的方式思考:** 在 Nushell 中,没有全局可修改变量的编码最佳实践延伸到了环境变量。使用内置的辅助命令可以让你更容易地处理 Nushell 中的环境变量问题。利用环境变量对代码块具有作用范围这一事实,也可以帮助你写出更简洁的脚本,并与外部命令互动,而不需要在全局环境中添加你不需要的东西。 +**以 Nushell 的方式思考:** 在 Nushell 中,没有全局可修改变量的编码最佳实践延伸到了环境变量。使用内置的辅助命令可以让你更容易地处理 Nushell 中的环境变量问题。利用环境变量对代码块具有作用范围这一特性,也可以帮助你写出更简洁的脚本,并与外部命令互动,而不需要在全局环境中添加你不需要的东西。