Shell 初始化配置指北 | Ubuntu

唠唠闲话

概要:在不同的Shell环境(如Bash和Zsh)中设置环境变量、设置初始脚本,以及如何根据不同的使用场景(用户级或系统级)管理和设置初始运行命令。

p.s. 如果你很熟悉 Linux,推荐跳到最后一节。这些对多用户场景很有帮助:比如设置全局生效的 Conda/Cuda 路径,快捷别名等。

小知识

在终端运行可执行文件时,通常不需要输入完整路径,比如运行 Python 输入 python 而不是 /usr/bin/python。通过执行 which 可以查看实际执行文件的路径。

一些基础命令,比如 pwd, echo, source, which,用 which 查询会提示你是内置命令(built-in command)。

而大多数命令,比如 git, vim, nginx 等等,都是执行省略了文件路径的可执行文件。更具体地,执行 git 时,系统会在 PATH 给的路径中依次查找,如果存在该可执行文件则运行。

因此,如果要省略绝对路径来执行某个文件,可以将该路径添加到 PATH 中。

修改 PATH

习惯上,可以将 $HOME/.local/bin 添加到环境变量 PATH 中,然后可执行文件存放或者链接到该目录:

bash 复制代码
# 创建目录
mkdir -p $HOME/.local $HOME/.local/bin

然后在 .bashrc/.zshrc 中添加如下内容,其中冒号用于分隔路径

bash 复制代码
export PATH=$HOME/.local/bin:$PATH

脚本生效级别

除了修改用户级别的 ~/.bashrc, ~/.zshrc ,还有其他根据不同情况生效的脚本。

用户启动 bash 时,涉及的几个文件:

文件 作用
/etc/environment 系统级别的配置文件,用于设置环境变量,不支持 $ 语法
/etc/profile 全局配置脚本,当一个用户 登录 并使用Bash或兼容的shell时,这个文件会被执行。它经常用来设置环境变量和运行登录脚本。
/etc/profile.d 包含了一些脚本,通常在执行 /etc/profile 的时候会被自动运行。它允许系统管理员把特定的初始化脚本分散到不同的文件中,以便管理。
/etc/bash.bashrc 用于设置全局的Bash shell行为,它在每次打开新的Bash shell时被读取。
~/.bashrc 用户级的Bash配置文件,它在每次打开新的Bash shell时被读取。
~/.bash_profile 用户级的,仅在Bash登录shell启动时被读取。比如用 ssh 登录服务器,且默认 shell 为 bash 时,会执行该文件。

用户启动 zsh 时,涉及的几个文件:

文件 作用
/etc/environment 系统级别的配置文件,用于设置环境变量,不支持 $ 语法
/etc/zsh/zshenv 这是全局的Zsh环境配置文件,无论何时启动Zsh都会被读取。通常用来设置环境变量。
/etc/zsh/zprofile 全局配置脚本,仅在Zsh的 登录 shell启动时被读取。它类似于/etc/profile,用于登录时初始化设置。
/etc/zsh/zshrc 用于设置全局的Zsh行为,它在每次打开新的Zsh shell时被读取,类似于Bash的/etc/bash.bashrc。
/etc/zsh/zlogin 全局登录脚本,它在Zsh登录shell启动时,在 读取zprofile之后被执行。
/etc/zsh/zlogout 全局登出脚本,它在Zsh登录shell登出时被执行。
~/.zshrc 用户级的Zsh配置文件,每次打开新的Zsh shell时被读取,用于个人shell行为

简单说:

  • 用户级别的修改,可以修改 ~/.bashrc 或 ~/.zshrc
  • 系统级别的变量,可以修改 /etc/environment
  • 系统级别的脚本,可以修改 /etc/bash.bashrc 或 /etc/zsh/zshrc
  • 系统级别,且在登录生效的脚本,可以修改 /etc/profile 或 /etc/zsh/zprofile

我们也可以手写一个脚本,方便维护公共变量:

bash 复制代码
# 维护公共脚本
sudo touch /etc/universal_rc
# 维护登录后的公共脚本
sudo touch /etc/universal_profile

然后在 /etc/bash.bashrc 和 /etc/zsh/zshrc 中添加如下内容:

bash 复制代码
if [ -f /etc/universal_rc ]; then
   source /etc/universal_rc
fi

以及在 /etc/profile 和 /etc/zsh/zprofile 中添加如下内容:

bash 复制代码
if [ -f /etc/universal_profile ]; then
   source /etc/universal_profile
fi
相关推荐
LateFrames8 分钟前
“场控软件” 如何容错与运维
运维·容错·led大屏·播控系统·场控软件
Uncertainty!!9 分钟前
Windows 10 与 Ubuntu 22.04 通过 Samba 共享文件夹
windows·ubuntu·共享文件夹
あ-17 分钟前
CubeSandBox配置CubeMaster CPU 超分
linux·运维·服务器
Escalating_xu20 分钟前
【Linux 网络编程】TCP Socket 编程(上):从 listen、accept 到完整回显通信
linux·网络·tcp/ip
老秦包你会27 分钟前
Linux第十课---------Linux信号
linux
艾伦_耶格宇37 分钟前
【DOCKER容器实战】-5 Docker容器镜像的构建
运维·docker·容器
速捷工控 PLC触摸屏还原程序1 小时前
S7-200 SMART程序上传提示密码?维修、改造和换机怎么选处理路径?
运维·服务器
缘友一世1 小时前
GLM5.3 CyberSec w4A16本地部署[2]:并行策略与 PP 切分
ubuntu·vllm·glm5.3 cybersec
北风toto2 小时前
Linux 服务器如何判断 CPU 是否支持 x86-64-v2 指令集
java·linux·服务器
程序员-Benothing2 小时前
Linux抓包分析教程:tcpdump、Wireshark、tshark实战
linux·运维·服务器