Skip to content
Go back
Table of Contents

Shell & Terminal

Shell 类型区分

交互式(Interactive)

交互式 shell 又有两种模式,登录式非登录式(login and non-login)。

非交互式(Non-interactive)

顾名思义,非交互式 shell 专注于执行任务,而不是与用户交互,一般通过脚本执行或系统任务调度启动。

如何区分?

在 shell 中输入 echo $-,若返回字符串有 i 那就是交互式,输入 echo $0,若返回字符串以 - 开头便是登录式。

Last login: Wed Oct  2 00:47:35 on ttys000
  ~ echo $- | grep i    # 若有 i 直接高亮显示,表示是交互式

569JNRXghikls
  ~ echo $0    # 由于在 zsh 中编写,所以输出 -zsh
-zsh
  ~ zsh
  ~ zsh
  ~ ps -f    # 上面直接又新启动了两个 zsh,可以看到下面输出只有第一个是登录式
  UID   PID  PPID   C STIME   TTY           TIME CMD
  501 26153 26152   0  1:05上午 ttys001    0:00.13 -zsh
  501 26596 26153   0  1:05上午 ttys001    0:00.11 zsh
  501 26833 26596   0  1:05上午 ttys001    0:00.12 zsh

配置文件

以下均以 shell 是 bash 举例

首先是根目录下(即 系统级 配置),/etc/profile登录 shell 配置文件,当 任何 用户登录到系统(无论是图形界面还是命令行界面)时,这个文件都会被执行,它通常用来设置环境变量或执行其他系统范围的初始化任务,然后是 /etc/bashrc,这是 非登录 shell 配置文件,/etc/environment所有 shell 都有效的配置文件。可能还会有 /etc/bash_login /etc/bash_logout,但这些是非标准配置文件,正确做法下面解释。 再看到用户主目录下(即 用户级 配置),~/.bash_profile登录 shell 配置文件,若不存在接着寻找 ~/.bash_login,若仍不存在接着寻找 ~/.profile,以上三者 仅加载第一个存在 的配置文件。~/.bashrc非登录 shell 配置文件。在退出 shell 时加载 ~/.bash_logout

若是 PowerShell ,则控制台支持以下基本配置文件。 这些文件路径是默认位置。具体见 微软文档

  • 所有用户,所有主机
    • Windows - $PSHOME\Profile.ps1
    • Linux - /opt/microsoft/powershell/7/profile.ps1
    • macOS - /usr/local/microsoft/powershell/7/profile.ps1
  • 所有用户,当前主机
    • Windows - $PSHOME\Microsoft.PowerShell_profile.ps1
    • Linux - /opt/microsoft/powershell/7/Microsoft.PowerShell_profile.ps1
    • macOS - /usr/local/microsoft/powershell/7/Microsoft.PowerShell_profile.ps1
  • 当前用户,所有主机
    • Windows - $HOME\Documents\PowerShell\Profile.ps1
    • Linux - ~/.config/powershell/profile.ps1
    • macOS - ~/.config/powershell/profile.ps1
  • 当前用户,当前主机
    • Windows - $HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
    • Linux - ~/.config/powershell/Microsoft.PowerShell_profile.ps1
    • macOS - ~/.config/powershell/Microsoft.PowerShell_profile.ps1

最佳实践

/etc 目录下的配置文件不应主动修改,一般只需要关注当前用户 shell 的生命周期。
~/.bash_profile 中添加环境变量、路径或其他全局配置。
~/.bashrc 中添加个性化配置,如别名、函数、主题等。
其余配置文件不主动修改。

Bash & Zsh 文件对比

在 Linux 和 macOS 10.14(代号 Mojave)及之前的系统里,默认使用 Bash。
在 macOS 10.15(代号 Catalina)及之后版本默认使用 Zsh。
两者配置文件对比如下:

(按照加载先后顺序排列!!)

BashZsh
/etc/environment/etc/zshenv = ~/.zshenv
/etc/profile/etc/zprofile
~/.bash_profile~/.zprofile
/etc/bashrc/etc/zshrc
~/.bashrc~/.zshrc
/etc/bash_login/etc/zlogin
~/.bash_login~/.zlogin
~/.profile(非必要)
~/.bash_logout~/.zlogout
/etc/bash_logout/etc/zlogout

NOTE

/etc/profile /etc/environment ~/.profile 都是 Bourne shell(sh)及其兼容的 shell(如 Bash)通用配置文件。

Shell 选择

上面也提到了,Linux 默认 shell 为 Bash(Bourne Again Shell),而现在较新的 macOS 都使用 Zsh(Z Shell)。除此之外,还有最古老的始祖 sh(Bourne Shell),新兴的 Fish(the friendly interactive shell)。当然,这些 shell 在 Linux 和 macOS 上都可以使用,可以根据个人偏好选择。

在 Windows 中自带两个 shell,分别是 the Command shell 和 Windows PowerShell,前者更基础底层,后者更复杂强大。注意,现在 Windows 更推荐使用 PowerShell 7.x,由于 PowerShell core 基于 .NET 构建,所以跨平台通用,并且支持管道操作(不同于 Unix/Linux Shell 的文本传输,是更强大的对象传输)。

推荐阅读:Windows PowerShell 5.1 与 PowerShell 7.x 之间的差异

额外提一下 Nushell,一个现代化的跨平台 Shell,专为处理结构化数据而设计,尤其适合需要在命令行中进行数据操作和分析的用户。

Terminal 选择

默认终端

第三方终端

终端技术栈平台支持特性
AlacrittyRust全平台专注性能,无 GUI 配置,无 SSH 功能
Ghostty 开发中ZigLinux/macOS编写语言更接近底层,兼顾性能和功能
HyperTypeScript全平台基于 Electron 性能一般,插件生态基于 NPM 非常丰富
iTerm2Objective-CmacOS功能内置极为全面
KittyPython/CLinux/macOS支持图形化内容,通过 Python 扩展插件
Rio 开发中Rust全平台继承大量 Alacritty 特性
TabbyTypeScript全平台基于 Electron 性能一般,插件系统支持(JS/TS 编写)
WezTermRust全平台支持通过 Lua 扩展,兼具灵活和高性能

附 1:Shell 美化

附 2:命令行工具

自用

记录一下好用的命令行工具,基本为 Unix/Linux 使用,大部分可在 Windows 上使用

命令行替代

Rust 规避了 C++ 项目的弊病,同时保证了良好的跨平台性质,被广泛用于命令行工具的重写。

终端复用工具

参考


Previous Post
[转]CRLF 与 LF:换行到底是什么?
Next Post
配置 WSL 深度学习环境