ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Zsh 与 Bash 全面对比:面向 refine 工程实践的命令行与脚本指南

Zsh 与 Bash 全面对比:面向 refine 工程实践的命令行与脚本指南 Zsh 与 Bash 全面对比面向 refine 工程实践的命令行与脚本指南【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine本篇指南系统对比 Unix 世界两大主流 Shell——BashBourne Again Shell与 ZshZ Shell从二者的定位、基础特性差异到启动性能优化、Windows/macOS/Linux 的安装配置再到脚本编写、作业控制与跨平台/Docker 容器兼容性实战。读完你将能够根据自己的开发场景交互式体验 or 标准化脚本做出明确的 Shell 选型决策并掌握让脚本在 Windows、macOS、Linux 及容器环境中稳定运行的实用方法。文中所有命令与脚本均基于真实可运行的写法并辅以 refine 开源仓库中的工程实践佐证。引言从图形界面到 Shell在计算早期程序员通过非图形化的接口——Shell或称为终端与计算机系统通信。Shell 是每台电脑/操作系统自带的图形用户界面GUI之外的另一种交互方式它让你能够完成 GUI 能做的所有事情但更简单、更可控、更易于自动化。与依赖视觉元素和点击的 GUI 不同Shell 是纯文本工具你只需通过键盘输入文本字符即可完成同样的任务。在所有 Unix 系 Shell 环境中最著名的两个当属Zsh与BashZsh完全可定制具备自动补全、语法高亮、插件支持等特性非常适合现代、交互式的工作流Bash则以简单、POSIX 兼容著称在脚本自动化与跨平台能力上表现扎实可靠。因此当你追求高级定制与现代用户体验时 Zsh 是理想选择而需要标准化脚本与高度可靠性时Bash 更胜一筹。对于像 refine 这类重度依赖命令行工具链pnpm、lerna、nx、cypress 等的开源项目理解这两种 Shell 的差异会直接影响日常开发效率——仓库根目录 package.json 中定义的dev:docs、test:all、build:all等脚本本质上都是一串需要在 Shell 中执行的命令组合。Bash 是什么BashBourne Again Shell 的缩写是一种基于 Unix 的 Shell 与命令处理器它提供命令行界面让你通过执行命令或运行脚本与操作系统的所有组件交互。Bash 内置了丰富的命令与工具覆盖文件操作、文本处理、系统管理等多种任务。接下来的章节我们会逐一介绍 Bash 的可用特性。Zsh 是什么ZshZ Shell 的缩写发音为 Zee shell 或 Zed shell是 Bash 的扩展与改进版本既可以作为交互式登录 Shell 使用也可以作为 Shell 脚本与命令编程的解释器。虽然 Zsh 与 Bash 并非完全兼容但二者共享不少类似的功能与特性。Zsh 被设计为一个高度可定制的 Shell提供交互式命令行界面用于执行命令、运行 Shell 脚本以及完成各种系统管理任务。Bash 与 Zsh 的基础特性Bash 与 Zsh 是功能相似的工具拥有大量相同的特性与能力来完成同样的任务。不过在特性与能力上二者各有侧重。下面我们分别介绍这两种 Shell 的显著特性。Bash 的特性1. 花括号展开Brace Expansion花括号展开是 Bash 中根据指定模式或值集合生成多种组合或序列的技巧基本语法是将模式或值集合放入花括号{}中。例如生成序列{1..5}生成从 1 到 5 的数字序列1 2 3 4 5。嵌套花括号展开{1..3}{a,b}生成数字序列与字母序列的组合1a 1b 2a 2b 3a 3b。2. 制表符补全Tab Completion输入命令时按下 Tab 键Bash 会自动使用命令行补全来匹配内建命令选项、程序名、文件名与变量名。3. 可移植性Portability如果你希望 Bash 脚本或命令高度符合 POSIX 1003.2 标准可以以--posix选项启动 Bash或在脚本/会话中执行set -o posix。4. 命令历史Command History使用history命令可以查看、编辑并重新运行此前在 Shell 中执行过的 500 条命令。5. 命令的批量与并发执行顺序执行多条命令command1; command2并发执行两条命令使用字符语法为command1 command2。Zsh 的特性1. 可主题化的提示符Themeable Prompts可主题化提示符允许你自定义命令行提示符的外观与行为。例如你可以让 Zsh 在输入长命令时自动隐藏提示信息或将提示信息显示在屏幕右侧。2. 拼写检查与自动填充Spell Checking and AutofillZsh 内置拼写检查与自动填充能力帮助你检测并纠正工作流中的拼写错误例如shopt -u cdspell所管理的 cd 拼写纠错在 Zsh 中属于开箱即用的能力。3. 语法高亮Syntax HighlightingZsh 最大的超能力之一是其可扩展性。Zsh 支持语法高亮能够根据语法类型以不同颜色直观地标识命令或脚本的各个部分便于快速识别。优化 Zsh 与 Bash 的性能无论是 Zsh 还是 Bash改善 Shell 环境性能都是值得投入的方向。这里给出几个思路及对应的示例代码。缩短 Shell 启动时间在 Zsh 中可以通过对插件实现**懒加载lazy loading**来减少启动时间。示例写入~/.zshrc# .zshrc # Load plugins when they are only necessary zmodload zsh/complist autoload -Uz compinit compinit autoload -Uz promptinit promptinit这样能确保 Zsh 只在真正需要时加载部分模块而不是在启动时就全部加载从而显著加快新终端窗口的打开速度。资源管理在 Bash 与 Zsh 中避免过多使用后台进程有助于更好地管理系统资源。下面是在 Bash 中的做法写入~/.bashrc# .bashrc # Disable command autocorrection on a bash shopt -u cdspell通过禁用 Bash 中不必要的特性例如命令自动纠错cdspell可以进一步节省 CPU 周期与内存占用。日常任务的性能基准测试还可以对典型任务进行基准测试来定位性能瓶颈。下面是一个对目录内文件列表操作计时的示例脚本# time_list.sh #!/bin/bash start_time$(date %s%N) ls -l end_time$(date %s%N) execution_time$((end_time - start_time)) echo Execution time: $execution_time nanoseconds该脚本对ls -l命令的执行进行计时可用于对比 Bash 与 Zsh 在相同任务上的性能差异。对于 refine 这样的 pnpm monorepo参见 pnpm-workspace.yaml 与 lerna.jsonShell 启动速度与命令执行开销会直接影响pnpm dev、lerna run test等高频命令的体感响应。在 Windows 上安装 Bash 与 Zsh与 macOS 和 Linux 不同Windows 上 Bash/Zsh 并非开箱即用需要额外配置。本节介绍两种在 Windows 上使用 Bash 的常见方法。方法一Git BashGit Bash 是面向 Windows 的 Shell 应用程序为通过命令行界面与 Git 交互提供了模拟层。如果你已有 Git 经验很可能已经安装过 Git安装Git for Windows时会顺带安装 Git Bash安装完成后可以像启动其他应用程序一样运行它。运行后可以用以下命令确认当前 Shell 确实是 Bashecho $SHELL输出会显示类似/usr/bin/bash的路径具体取决于安装位置。方法二Windows Subsystem for LinuxWSL在 Windows 10 及以上版本中另一种使用 Bash 的方式是通过 Windows Subsystem for LinuxWSL。步骤如下启用 WSL打开控制面板→程序→启用或关闭 Windows 功能勾选 Windows Subsystem for Linux或使用适用于 Linux 的 Windows 子系统选项。勾选后需要重启计算机使更改生效。安装 Linux 发行版由于 Bash 是大多数 Linux 发行版的默认 Shell可选用任何你熟悉的发行版。本指南以 Ubuntu 为例打开Microsoft Store搜索并安装 Ubuntu。在开始菜单搜索并运行Ubuntu应用程序。首次启动 Ubuntu 时会进入一系列配置提示用于设置你的用户名与密码。运行echo $SHELL确认你正处于 Bash 环境中。在 WSL 中安装 Zsh一旦 Bash 在你的电脑上正常工作就可以用它安装任何其他 Shell 环境包括 Zsh、ksh 等等。打开 Ubuntu 并运行sudo apt-get install zsh安装完成后运行zsh --version确认 Zsh 是否成功安装。最后运行zsh切换 Shell 环境到 Zsh。注意Zsh 只能在基于 Linux 的操作系统中运行例如 Windows 上的 Ubuntu/WSL如果试图在普通命令行cmd或 PowerShell 中运行zsh它是无法工作的。在 macOS 与 Linux 上使用 Bash 和 Zsh如果你属于这两类用户那么恭喜Bash 与 Zsh 在 macOS 和 Linux 发行版上都唾手可得你可以根据自己的需求与偏好灵活选择。macOSBash 从 macOS 10.3 起一直是默认 Shell直到 10.15macOS Catalina将默认 Shell 改为 Zsh。不过较新版本的 macOS 仍然内置 Bash你可以随时将默认 Shell 切换为两者中的任何一个。Linux与 macOS 类似Bash 预装于大多数 Linux 发行版Zsh 则需要手动安装不同发行版的安装方式各异可查阅对应发行版的软件包管理器如 Debian/Ubuntu 系用sudo apt-get install zsh、Fedora 系用sudo dnf install zsh。Bash 特性深入命令行编辑在 Bash 中可以使用标准编辑键来编辑命令移动光标使用方向键左/右箭头将光标从行尾移动到行首任意定位删除字符使用退格键Backspace或删除键Delete剪切、复制与粘贴通过一系列快捷键快速完成。以命令echo Hello, World!为例先用左箭头把光标移到World之前按CtrlK剪切从光标处剪切到行尾再按CtrlY粘贴到别处。命令召回Command RecallingCtrlR快捷键允许你从历史记录中查找、检索并召回特定命令前提是你记得该命令的一部分。只需几次按键Bash 就会搜索你的命令历史并展示匹配的命令列表。示例按CtrlR后输入Hello即历史命令echo Hello, World!的一部分即可从历史中召回并重新执行该命令。命令复用Command ReusingBash 提供快捷键以特定语法召回并复用先前命令的某些部分!!重复执行上一条命令!$引用上一条命令的最后一个参数。示例 1输入!!重复执行上一条命令。示例 2假设上一条命令是echo World随后输入!$会把World作为上一条命令的最后一个参数引用例如ls World即列出名为 World 的目录内容。Shell 脚本变量为了存储和操作数据可以使用无需声明数据类型的变量。变量可以持有字符串、数字或其他任何值。示例存储姓名、年龄、性别等个人数据时无需为 name 指定字符串类型、为 age 指定数字类型——直接命名变量并赋值即可nameAlice age30 genderFemale echo $name is $age years old如果你希望系统掌握 Bash 脚本参数处理的更多细节如$1、$2、$、$#等位置参数与特殊参数可以参考 refine 仓库中的另一篇相关文章 《Using Arguments in Bash Scripts》。Shell 脚本控制结构借助控制结构可以在脚本执行过程中控制 Linux 命令。使用 Bash 的 if-then-else、for、while 循环等控制结构可以根据指定条件构建执行各种操作的脚本。示例在 Bash 命令行中用for循环打印 1 到 3 的数字列表for i in 1 2 3; do echo $i done作业控制前台与后台前台作业Foreground Jobs是 Bash 中命令执行的默认行为运行任何命令时Shell 会等待该命令完成期间不接受其他输入。例如运行ls时Shell 会等待输出显示完毕再给出新提示符。后台作业Background Jobs允许命令或进程在后台运行同时你仍可在 Shell 中继续工作。在命令末尾加上符号即可将其转为后台作业例如long_running_task_command 。当命令异步在后台运行时你可以继续运行其他命令或脚本无需等待后台操作完成。Zsh 特性深入自动补全Auto-CompleteZsh 拥有全面的自动补全功能在输入命令、参数、文件名等内容时提供建议并自动补全能显著加快命令输入速度并减少错误。示例输入ls -l /us后按 Tab 键Zsh 会自动补全为ls -l /usr/的路径你可以继续输入或直接按回车执行命令。路径展开Path ExpansionZsh 拥有强大的路径展开特性可以定义模式并对文件与目录路径执行各种操作支持通配模式globbing、递归匹配、文件过滤等功能。示例输入ls /path/to/directory/**/*.txt并回车Zsh 会展开该路径并显示指定目录及其子目录下的所有文本文件列表**表示递归匹配子目录。主题与插件系统Zsh 最令人兴奋的地方在于它可以采用新主题。你可以为 Zsh 制作新主题、新插件或修改现有主题与插件以满足需求从而个性化 Shell、以插件添加实用功能并提高生产力。示例Oh My Zsh框架被广泛用于整合主题与插件例如agnoster主题展示带 Git 分支状态的提示符git 插件提供 Git 别名与快捷键。案例研究何时选 Bash何时选 Zsh更倾向 Bash 的场景场景 1命令行编辑。考虑修改一条用于在目录间同步文件的rsync命令。解决方案使用 Bash 的命令行编辑能力而无需重新输入整条命令——用上方向键召回上一条命令用左/右方向键导航到需要修改的文件路径或参数处修改后按回车执行。场景 2Shell 脚本自动化。假设你需要更新仓库中的代码、停止服务器、再重启以发布 Web 应用。解决方案编写一个 Shell 脚本来自动化该流程并保证一致性——用文本编辑器创建deployment.sh写入停止服务器、更新代码、重启服务器的命令保存后chmod x deployment.sh赋予执行权限最后./deployment.sh执行。这类构建-测试-发布脚本正是 refine 仓库中大量 npm scripts 的常见形态例如根目录 package.json 中nuke系列命令就用rimraf清理各类构建产物与锁文件。场景 3后台处理。你有一些耗时的任务或进程需要在后台运行或交互式管理。解决方案使用作业控制有效管理前台与后台操作——将数据处理脚本作为后台作业启动用jobs命令监控后台作业进度必要时将其调回前台进行交互式监控。更倾向 Zsh 的场景场景 1自动补全。面对一个包含大量文件与子目录、且命令参数复杂的目录结构时Zsh 可以通过输入前几个字符并按 Tab 键自动补全文件名与目录名让访问或修改它们变得更简单。例如输入cd /u/lo并按 Tab可能自动补全为cd /usr/local/。场景 2路径展开。当你希望对多个文件或文件夹一次性操作、而不必逐一指明例如删除某个目录下的所有文本文件时可以用路径展开一次删除多个文件输入rm /path/to/directory/*.txt该目录下所有文本文件将被移除。场景 3主题与插件系统。你可以使用 Zsh 命令行中的插件或工具完成网页搜索而不必单独打开浏览器手动输入搜索词。例如Web-Search插件可以为 Google、Wiki、Bing、YouTube 等常用服务添加别名让你直接在命令行内完成搜索。跨平台兼容性大多数开发者都在 Shell 环境中工作和编写脚本因此让脚本跨平台运行是一个重要议题。下面是如何处理跨平台兼容性的实用方法。跨操作系统的可移植性确保脚本能在 Windows、macOS、Linux 上无阻碍运行使用 POSIX 兼容命令尽量遵循 POSIX 兼容的命令与语法。POSIX 是 Unix 系操作系统之间保证兼容性的标准。# Sample POSIX-compliant syntax for file in *; do echo $file done该循环在大多数 Unix 系系统上都能正常工作。避免使用操作系统特定命令某些命令如ls与dir存在操作系统特定的差异。应使用广泛支持的通用命令或添加条件判断# Example of Conditional OS Check if [ $(uname) Linux ]; then ls -la elif [ $(uname) Darwin ]; then ls -lG else echo Unsupported OS fiDocker 与容器兼容性在 Docker 或容器化环境中工作时务必确保 Shell 脚本在容器内也能正常运行在 Docker 中测试脚本始终在脚本将要执行的 Docker 环境中进行测试确保所有依赖都被正确配置# Sample Dockerfile to try a script FROM ubuntu:20.04 COPY script.sh /usr/local/bin/script.sh RUN chmod x /usr/local/bin/script.sh CMD [/usr/local/bin/script.sh]这种多阶段构建 环境变量注入的容器实践在 refine 仓库中有真实体现例如 examples/store/Dockerfile 中通过ENV PNPM_HOME/pnpm、ENV PATH$PNPM_HOME:$PATH配置包管理器路径用RUN corepack enable启用 pnpm并以CMD [node, ./examples/store/server.js]启动应用——整条构建链本质上都运行在容器内的 Shell 环境中任何脚本兼容性问题都会在RUN阶段暴露。使用环境变量Docker 对环境变量支持良好让脚本保持灵活使配置可以通过环境变量传入# Usage example of environment variables in a script echo Running in environment: $ENVIRONMENT把注意力放在这些方面就能确保脚本不仅在不同平台上稳定可用也能在不同环境中正常工作从而降低系统间迁移时可能遇到的问题。结论关键要点总结Bash 与 Zsh 都是广受欢迎的 Unix Shell用作命令语言并支持 Shell 脚本。Bash 凭借广泛采用、POSIX 兼容与熟悉度仍是简化命令行体验的可靠之选Zsh 则引入了自动补全、路径展开、可定制提示符、语法高亮、主题与插件支持等高级特性能够显著提升生产力与用户体验。最终选型建议选择 Bash 还是 Zsh最终取决于你的需求与个人偏好。没有绝对的优劣答案两者各有独特优势与能力如果你最看重兼容性需要与不同 Unix 系统最大程度兼容或满足 POSIX 合规要求Bash 是最佳选择——它是许多 Linux 发行版与 macOS 的默认 Shell能确保你的脚本和命令在这些平台上正常工作如果你的需求偏向定制化那么 Zsh 的定制能力远胜 Bash。例如 Zsh 拥有名为 Oh My Zsh 的丰富开源框架与社区用于管理 Zsh 配置与定制。事实上两种 Shell 完全可以共存于同一台机器如在 WSL 中同时安装 Bash 与 Zsh日常交互用 Zsh、编写发布脚本用 Bash是许多开发者的常见工作方式。【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表