配置文件
In Unix-like systems, many softwares use configuration files, because their filenames are always .xxx
, they are called dotfiles.
A useful way of control many softwares' configuration files is that create a folder named dotfiles, then git clone dotfiles which are shared by other people, at last create symlinks from real dotfiles to shared dotfiles in the dotfiles folder.
By using this dotfiles folder, you can easily achieve version-controller, and you can have you dotfiles tidy.
不同shell具有不同的配置文件,下面主要介绍bash和zsh两种shell所具备的配置文件。
在介绍配置文件之前,需要首先理解shell的两个属性:1. 是否为交互式 2. 是否需要登陆
bash
zsh
系统级别配置文件
/etc/zshenv
:在所有用户的Zsh shell启动时执行,设置全局的环境变量,包括PATH、LANG、EDITOR等/etc/zprofile
:在登录shell启动时执行一次,添加系统级别的路径、执行系统级别的配置文件等/etc/zshrc
:每次新开一个交互式的Zsh shell时执行,定义个人级别的配置,如别名、函数、自定义命令等/etc/zlogin
:登录shell结束时执行的脚本,用于启动窗口管理器或其他应用程序/etc/zlogout
:交互式shell结束时执行的脚本,用户清理和收尾工作,例如关闭打开的文件、清理临时文件、发送通知等
用户级别配置文件
~/.zshenv
:在每个用户的Zsh shell启动时执行~/.zprofile
:在登录shell启动时执行一次~/.zshrc
:每次新开一个交互式的Zsh shell时执行~/.zlogin
:登录shell结束时执行的脚本~/.zlogout
:交互式shell结束时执行的脚本
交互式shell和登录shell是两种不同的shell运行模式,它们有以下区别:
登录shell(Login Shell):
运行时机:当用户登录到系统时,会启动一个登录shell。
执行顺序:登录shell首先会执行系统级别的配置文件(如/etc/profile),然后执行用户级别的配置文件(如/.profile或/.bash_profile),最后才执行交互式shell的配置文件(如~/.bashrc)。
特点:登录shell在启动时只会执行一次配置文件,通常用于进行全局性的设置和初始化操作。
交互式shell(Interactive Shell):
运行时机:在登录后或通过终端程序打开新的命令行界面时,会启动一个交互式shell。
执行顺序:交互式shell只会执行用户级别的配置文件(如/.bashrc或/.zshrc),不会执行系统级别的配置文件。这些配置文件主要用于定义个人级别的别名、函数、自定义命令等。
特点:交互式shell会在每次启动时都执行相应的配置文件,以确保用户个性化的设置生效。
总结:登录shell和交互式shell的主要区别在于运行时机和执行的配置文件。登录shell在用户登录时启动,并且按照特定的顺序执行系统和用户级别的配置文件;而交互式shell在每次新开一个命令行界面时启动,并且只执行用户级别的配置文件。这种区分使得我们能够对系统级别和个人级别的设置进行灵活的管理和组织。
从使用alias
设置别名的过程看.zprofile和.zshrc的区别,以及全局环境变量和shell变量的区别
首先将别名设置在.zprofile中,在新开terminal中,别名是正确存在的,但是在当前shell中新开zsh或者bash别名就消失了,但是如果将别名添加在.zshrc中,就不会出现这种问题。
第一点,.zprofile只有在登陆shell开启时才会被执行,在当前shell中新开shell属于非登陆shell,并不会执行.zprofile,而.zshrc无论是在登陆shell还是非登陆shell都会执行。
第二点是,注意到.zprofile中还有其他一些向\(PATH添加内容的语句,可以发现的是,即使是新建一个非登陆shell,对\)PATH的修改依然是生效的。这一现象涉及到的是全局环境变量和shell变量的区别
由于alias创建的是shell变量,仅在当前shell session中生效,如果将alias语句放置于.zprofile中,那么只有在最开始的登陆shell中是存在的,后续创建的非登陆shell由于切换了shell,并且不会再执行.zprofile,所以别名不复存在了
那么一种解决方法就是将alias
语句放置在.zshrc中,虽然创建的仍然是仅在当前shell中存在的shell变量,但是在shell切换时,会重新执行.zshrc,因此别名会被重新创建
那么为何.zprofile中其他一些语句没有收到影响呢?因为那些语句是使用export
向全局环境变量中添加的内容,并不会受到shell切换的印象,即使shell切换时不会再执行.zprofile,也不会受到影响
那么结合这里例子,就不难理解何时需要将内容写入.zprofile,何时需要将内容写入.zshrc
当语句修改的是全局环境变量时,只需要执行一次,并不会受到shell切换的影响,那么就写入.zprofile
如果修改的是shell变量,由于只会在当前shell中生效,就需要在每次shell切换时都执行一次,那么就写入.zshrc
修改全局环境变量使用
export
,修改shell变量使用set
(参考)