学会爱你的终端

介绍

在阅读《Linux终端介绍》(LINK0)和《Linux命令行先导》(LINK1)后,你应该对在现代命令行环境中工作的基本知识有很好的了解,但是,许多对命令行的新用户可能仍然觉得它相当限制。本教程旨在为这些用户提供更多的命令行界面背景,以及关于定制和跨平台可移植的建议。

<$>[注] 由于在Windows上开始使用终端可能比其他平台更不直观,本教程的第一部分将涵盖Windows终端环境。

改进您的 Windows 终端体验

在Windows上,有许多选择的终端等级。历史上,Windows没有使用Unix风格的命令行壳,如bash,这是自2000年代初以来在macOS和Linux上普遍存在的。它也缺乏特别的功能来突出文本,打开多个标签,等等。

相反,Windows提供了自己的两种原始命令行接口:Windows Command Prompt,从Windows 7开始,微软 PowerShell。命令 Prompt,也被称为cmd.exe,使用传统的MS-DOS语法,相对较少的补充。

这些 Windows 壳中没有包含现代 Unix 式壳的许多基本特性,而且它们通常不适合大多数云开发。 因此,需要在 Windows 云服务器上工作的用户通常会安装软件,如 PuTTY (a tty是现代 Unix 终端的历史名称), mobaXterm,或 ConEmu. 每个应用程序通常都会包含自己的终端接口,以及内置的 SSH 客户端来连接到远程服务器。 这两种功能通常在其他平台上不被认为是相似的,但在 Windows 上,它通常是一个安全的假设,如果你需要一个 Unix 式终端,你会在远程服务器上工作,所以他们经常被包

在其他平台上,ssh只是一个可以从终端运行的命令行程序,它是Linux实用工具的核心组的一部分。在Windows上还可以安装这些核心Linux实用程序,以及标准的bash壳的端口。最初,这个功能是由Cygwin(https://www.cygwin.com/)项目提供的,该项目包括许多其他Linux系统工具的端口。在Windows上安装Git(https://gitforwindows.org/)还提供来自MSYS2(https://www.msys2.org/)项目的bash壳,这与Cygwin共享了一些功能和上游代码。这将允许您,例如,在Windows上从命令行中安装ssh - 以及使用常见的Linux实用程序如pgrecat - 无需另一个程序来提供这种功能。

Windows 包管理器

这些Linux公用设施到Windows的端口一般都很坚固并维护良好. 然而,它们有一些显著的缺点,使得它们比在macOS或Linux上使用相类似的功能更不受欢迎. 一是它们一般不包括全能的[包装管理 (https://andsky.com/tech/tutorials/package-management-basics-apt-yum-dnf-pkg),用于根据需要安装其他命令行软件,这是大多数Linux环境的核心假设(也由macOS上的Homebrew等工具提供). 近年来,Windows获得了它自己的指令行包管理器的生态系统,如[Chocolatey] (https://chocolatey.org/)和[Scoop] (https://scoop.sh/),可以和Git的"bash"外壳或其他环境一起使用. 和macOS上的Homebrew一样,这些在本地机器上特别有用,因为它们除了命令行工具外,还可以用来安装桌面软件. 然而,由于大多数云软件在设计上仍然无法在Windows上本土运行,巧克力和Scoop的软件包寄存器往往不如他们的macOS或Linux等同器完整. 使用它们往往需要您将为更常见的平台所编写的安装文档翻译为工作Windows等同,使其对初学者用户不具有直觉.

另一个缺点是,PutTTy、Git Bash 和其他 Windows 终端环境通常具有非常差的用户界面功能,缺乏对语法突出或标签的支持.由于 Windows 命令提示已经一段时间没有明显改进,Windows 用户可能会被推向比 macOS 上现代终端(iTerm2)(https://iterm2.com/)的用户更不便的工作流程。 为了接近这样的环境,您可以相反地将 Git 的bash壳, Chocolatey 的包管理器和 ConEmu 的终端定制相结合。

<$>[注] 注: 也可以在单个壳中打开多个标签,而无需依靠终端模拟器的任何额外功能,例如 tmux

如今,你可以使用新的 Windows 终端WSL2,也被称为 _Windows 子系统为 Linux。这两个项目在很大程度上解决了许多突出的问题。Windows 终端提供了类似于 ConEmu的功能,如标签,突出和现代文本渲染,它可以与任何已安装的壳一起使用。它也被默认安装在 Windows 11 上,显著降低了访问障碍和需要第三方工具来完成这项工作。

WSL2是一个在Windows内部运行的完整的Linux环境. 由于它不是Linux工具到Windows的端口,因此具有显著的优势. 在WSL2环境中工作时,可以使用"apt"或"Homebrew"或其他任何本地Linux工具来安装和运行软件,与您在云端服务器上一样. 这也有一些缺点。 与 macOS 或 Linux 终端不同, 您无法从 WSL2 运行本地桌面软件, 只有 Linux 软件被安装到您的 Linux 环境中 。 在许多情况下,这将足够了,特别是当你大多使用您的终端向远程服务器部署软件或进行小的配置修改时. 然而,您仍然可能想要配置Windows终端,以根据您的需要来启动多个不同的 shell 环境:例如,一个使用 Git Bash 和 Coocloy, 与您的本地Windows 软件一起工作,另一个使用 WSL2, 提供完整的软件包管理器, 并允许您作为-is跟踪 Linux 文档 。 其中许多工具现在相互支持,相互支持,使这种工具相对直截了当,而且非常有力.

Windows Terminal displaying many shell options

zsh 和其他 Shell 解释器

虽然bash是现代Linux发行版中最常见的壳,其语法被认为是与大多数环境最广泛兼容的,但它不是唯一的。 _Bourne shell_语法,或/bin/sh,是bash的子集,有时仍在容器等最小环境中使用。还有Z壳,或zsh,由于其 更灵活的MIT许可证和可配置性而变得越来越受欢迎。

<$>[注] 注: 您可以在任何现代命令行环境中使用 chsh命令更改默认壳。

Zsh在许多环境中提供的主题、文本突出和非文本字符的渲染(也称为 glyphs,本质上是一种早期形式的Emoji)的支持比默认的bash壳更为广泛,这就导致了更大的Zsh终端定制工具的生态系统,例如Oh My Zsh.更重要的是,Zsh工具和文档通常优先安装支持复杂的Glyph字体的字体,如Powerline字体,这对解决其他环境中的文本渲染问题是有用的。

Example of Zsh theming

潜在的Zsh用户很快意识到的一个缺点是zshbash没有完全相同的语法,而bash壳脚本是迄今为止最常见的。

一般来说,如果您正在编写一个 shell 脚本的语法比bash更复杂,您应该考虑使用不同的脚本语言。 Shell 语法是强大的,但它也可能很糟糕。 例如, Go 语言已经成为使用比 shell 脚本更先进的流量控制的命令行工具的流行语言。 除了一些例外外,即使是zsh的专用用户也通常不会写和维护独立的zsh脚本。

考虑到这一点,你不应该担心使用zsh作为默认的互动壳所产生的任何兼容性问题。几乎所有的环境中,你可以运行zsh也将安装bash解释器来运行任何bash脚本,如有需要。当你写一个独立的壳脚本,或运行你从其他地方下载的壳脚本时,第一个行通常包含#!/bin/bash。这被称为 _shebang_,或 _interpreter directive_,这告诉计算机哪个程序,或解释器,以默认的方式使用以运行脚本。这对于无法通过其文件扩展区分开的壳脚本尤其重要:bash脚本和其他脚本都是以sh结束的。因为bash始终安装在bin/bash兼容

通过Globstars改进搜索

默认情况下在zsh中支持的先进壳语法的一个例子,但必须在bash中手动启用,是globstar**模式。Globbing是执行模糊匹配搜索的另一个名称,即使用wildcard*字符搜索文件。** globstar允许您不仅在单个文件名内使用wildcard substitution,而且在整个目录中使用wildcard substitution。例如,如果您在您的主目录中寻找一个名为config.txt的文件,但不知道在哪里寻找,您可能需要使用find等命令,该命令旨在通过嵌入式目录进行反复搜索。即使您已经知道find语法,这也会为您的过程添加一个额外的步骤,

通过使用globstar,你可以为任何其他命令提供一个~/**/config.txt之类的路径。 壳会自动为你扩展搜索,而无需直接调用find。 壳很擅长提供这种功能 - 通常需要一个完整的其他依赖可以被纳入一个单个额外的字符替代。 为了在bash中允许使用globstar,你可以运行shopt -s globstar

1shopt -s globstar

您还可以使用 DigitalOcean 的 Glob Tool来实验全球搜索字符串。

通过Rust改进您的终端的核心实用工具

正如上面提到的,Go语言已经成为构建现代命令行工具的非常强大。 另一个相对较新的编程语言,特别适用于命令行环境是 Rust. Rust 是一个低级别的语言,通常被认为与 C++ 和其他 C 喜欢类似,但具有更现代的语法和更少的 C 的累积行李。

几乎所有被认为对命令行环境至关重要的核心实用程序,如ssh,curlcat,都是用 _C 语言编写的,在许多情况下可以追溯到几十年的历史,这就是为什么他们中的许多都有(数十个选项)(https://linux.die.net/man/1/curl)在多年的活跃维护中被添加。

<$>[注] 注:Core utilities,或 coreutils,通常被认为是这个程序集合的实际名称。其中许多通常被认为是实际的终端命令而不是程序 – 例如,cd是终端语法,而cat是一个小型可替代的程序。

例如, bat提供更多的语法突出和类似的功能, dust类似于使用du来检查磁盘使用,但具有更复杂的图形输出, ripgreprg是一个更快的实施grep

这些新的 Rust 工具的相对优势不应该被视为对 C 或 Rust 本身的判断,或对它们的相对性能的判断。相反,它是长期保持相同代码库的结果。 许多核心 Linux 实用程序没有优先考虑更快,在大多数情况下,维护这些实用程序是确保它们不会与任何传统功能破坏兼容性。

个人资料和Aliases

这些新的 Rust 工具的最显著的缺点是,许多人实际上可能忘记使用它们,因为他们使用的习惯很快就会植根。

bashzsh 都支持配置文件. 一个配置文件是您主目录中的一个文件,名为 .bash_profile.bashrc 用于 bash,或 .zshrc 用于 zsh. 通常,当您首次启动壳时,它们会自动创建,但因为它们以. 字符开头,因此系统会将它们视为隐藏的,除非直接编辑,否则它们仍然不可见。

使用这种方法,你可以在你的 ~/.bash_profile 中创建一个代名词,使 grep命令总是运行rg而不是你的系统grep. 正如上面提到的,这些 Rust 工具通常不是默认安装的,所以你需要先安装 rg`。

1brew install ripgrep

接下来,使用nano或您最喜欢的文本编辑器打开~/.bash_profile

1nano ~/.bash_profile

然后,将一个行添加到包含alias命令的文件末尾:

1[label ~/.bash_profile]
23alias grep='rg'

保存并关闭文件,然后关闭并打开新的bash终端. 从现在开始,当您运行grep时,您将获得rg代替:

1grep --version
1[secondary_label Output]
2ripgrep 12.1.1
3-SIMD -AVX (compiled)
4+SIMD +AVX (runtime)

你应该知道,如果你复制并粘贴你在其他地方找到的grep命令,并且它使用了在rg中不存在的功能,它可能无法正常工作. 因此,你应该小心翼翼地使用代名词。 然而,它们对于创建快捷键是非常有用的,不会直接取代其他命令。 例如,Python编程环境配备了内置的Web服务器,可以通过运行python -m http.server port_number来服务任何小型的静态网站。 如果你经常使用这个功能,你可能希望在alias pyserver="python -m http.server 8000的行列中创建一个代名词。

<$>[注] **注: **在 ~/.bash_profile 中的外名不会超过独立的 bash 脚本中的任何命令,因为您的 ~/.bash_profile 默认情况下仅被加载到 interactive bash 壳中。

每个终端会话都默认配置了多个 _environment variables. 其中许多是由系统自动设置的,但您可以在 `~/bash_profile 中提供额外的翻译,或者在单个壳会话中进行互动。

1env
1[secondary_label Output]
2SHELL=/usr/local/bin/bash
3ITERM_PROFILE=bash
4COLORTERM=truecolor
5XPC_FLAGS=0x0
6TERM_PROGRAM_VERSION=3.4.15
7

其中许多包含有关您的壳本身的信息,这将不会特别有用。其中一个例外是PATH变量,其中包含所有自动检查运行命令行程序的目录列表。

1env | grep PATH
1[secondary_label Output]
2PATH=/usr/local/opt/mysql-client/bin:/Users/sammy/.gem/ruby/3.0.0/bin:/usr/local/opt/ruby/bin:/usr/local/lib/ruby/gems/3.0.0/bin:/Users/sammy/.cargo/bin:/Users/sammy/.rbenv/shims:/Users/sammy/.pyenv/shims:/Users/sammy/.pyenv/bin:/Users/sammy/Library/Python/3.9/bin:/usr/local/opt/gnu-sed/libexec/gnubin:/usr/local/sbin:/usr/local/opt/libpq/bin:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/opt/findutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/opt/X11/bin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands

请注意,此列表中的目录是由一个字符分开的::字符。一般来说,您的PATH变量将在Windows或macOS上更长时间,而不是在Linux上。Linux只试图强制安装命令行程序到类似bin/usr/local/bin的目录,而Windows和Mac软件通常安装在其他目录中,这些目录需要添加到您的PATH,以便这些命令在命令行上可用。通过包管理器安装软件通常会照顾到这一点。虽然您可以手动将程序移动到/usr/local/bin或其他目录,但请注意,包管理人员希望能够操纵这些目录的内容。任何您手动安装的程序可能会被过写,或者在尝试过写时会

您可以通过使用命令检查命令行程序的安装位置:

1which python
1[secondary_label Output]
2/Users/sammy/.pyenv/shims/python

如果一个程序存在于您的 PATH 上的多个目录中,在您的 PATH 变量中列出的目录将占据首位。Python 是一个臭名昭著的例子。由于 macOS 和 Linux 都包含一个版本的 Python,系统有时会更新过频或过频,所以诸如 pyenv等工具旨在尽可能早在您的路径上注册一个单独的 Python 安装。

每当你没有从命令中获得预期的结果时,请问自己这些问题:

  • 您想要執行的程式是否在您的路徑上?
  • 您安裝程式時應該由包管理員將其放在您的路徑上,還是您需要手動將其安裝在那裡嗎?
  • 這是您電腦上唯一有這個名字的程式版本嗎?

您的 PATH 和壳环境的可变继承行为通常是简单的 - 您可能只需要多个程序来做其他矛盾的假设. 知道如何检查和配置您的环境将有助于您在命令行上舒适。

结论

在本教程中,您审查了许多终端环境的细微差别,包括Windows上的配置,bash和其他壳之间的差异,现代命令行实用程序和环境变量,包括路径和名称。

接下来,您可能想要 学习如何使用 DigitalOcean 的命令行客户端, doctl

Published At
Categories with 技术
comments powered by Disqus