第14 章 使用 shell:初始化文件

两个特殊的文件,即 初始化文件(initialization file):

  • 登录文件(login file),存放着所有希望在每次登录时自动执行的命令;
  • 环境文件(environment file),存放着所有希望在新 shell 启动时自动执行的命令;

一些 shell 还支持注销文件(logout file),存放着注销时自动运行的命令。

总而言之,登录文件、环境文件和注销文件允许你在3个不同的时间执行那些希望自动执行的命令。这3个文件的名称在各个 shell 中各不相同:

shell 登录文件 环境文件 注销文件
C-Shell .login .cshrc .logout
Tcsh .login .tcshrc、.cshrc .logout
Bourne Shell .profile -- --
Korn Shell .profile $ENV --
Bash(默认) .bash_profile、.bash_login .bashrc .bash_logout
Bash(POSIX) .profile $ENV .bash_logout

注意,这些初始化文件都采用一个以 .(点)字符开头的文件名称,这样的文件称为"点文件"。这个点具有特殊的含义。

POSIX 标准要求 shell 应该支持登录文件和环境文件,但是没有必要支持注销文件。登录文件的名称应该是 .profile。但是为了保持灵活性,环境文件的名称没有固定,而是采取在名为 ENV 的环境变量中存放环境文件的名称的方法。

但是 Bash 被设计为以两种不同模式运行:在默认模式中,Bash 支持 POSIX 标准的增强版;在 POSIX 模式中, Bash 严格遵循 1003.2 标准。

以 POSIX 模式运行 Bash 有两种方法:

  • 使用 --posix 选项启动 Bash,适用于所有系统;
  • 一些 Unix 系统被设置成 bash 命令和 sh 命令都可以启动 Bash(Linux 中通常就是这种情况),在这样的系统上,bash 命令以默认模式启动 shell,而 sh 命令以 POSIX 模式启动 shell。

点文件和 rc文件

以一个点号开头的文件成为点文件或者隐藏文件,这些文件希望被忽略,ls 命令不列举任何点文件,除非使用了 -a (all files,所有文件)选项。

环境文件的名称都以字符串 rc 结尾,这是 Unix程序命名初始化文件的一种常见约定。不只是 shell,很多程序都是使用以 rc 结尾的初始化文件。例如 vi 和 ex 编辑器使用 .exrc 的初始化文件;Unix 电子邮件程序 mail 使用 .mailrc 的初始化文件。

标识 rc 代表 run commands,运行命令,也就是特定程序每次启动时自动运行的命令。来源于CTSS兼容分时操作系统中的 runcom 功能。当自己写了一个程序为 foo 时,也应该使用 .foorc 作为这个程序的初始化文件。

Unix中的文本编辑器

在 KDE 中,基于 GUI 的文本编辑器是 kedit;

在 Gnome 中,基于 GUI 的文本编辑器是 gedit;

其他的基于文本终端的简单编辑器:Pico、Nano;(Nano 是 Pico 的现代替代品)

登录 shell 和 非登录 shell

当在 shell 提示出输入命令时,使用的是交互式 shell;当运行 shell 脚本时,使用的是非交互式 shell。而交互式 shell 有两种不同的类型。

登录时启动的shell 称为登录 shell;其他的交互式 shell 称为非登录 shell。这两种 shell 的初始化文件的处理方式大不相同。

在桌面环境中,获得 shell 的方式有两种:打开一个终端窗口或者切换到虚拟控制台。当使用<Ctrl-Alt-F1>组合键进入虚拟控制台时,要求进行登录,此时启动的是一个 登录shell。另一方面,如果只是简单地打开一个终端窗口,则启动一个 非登录shell。

在任何时候,通过输入 shell 的名称启动一个新的shell 时,因为没有进行登录,所以新 shell 时一个 非登录shell。

使用 ssh(Secure Shell,安全 shell)可以连接到远程 Unix 主机,一旦 ssh 连接上,就必须登录,此时启动的是 登录shell。

何时执行初始化文件

登录shell 执行登录文件和环境文件;

非登录shell 只执行环境文件;

例如:

Bash(默认模式)

  • 登录shell:.bash_profile
  • 非登录shell:.bashrc

Bash(POSIX 模式)

  • 登录shell:.profile,然后 $ENV
  • 非登录shell:$ENV

只有 Bash 的 登录shell 只执行登录文件,而不执行环境文件。对于其他所有的shell 来说,登录shell 既执行登录文件,也执行环境文件,并按照这个顺序执行。

初始化文件里的内容

登录文件有两项任务:设置环境以及初始化工作会话。因此,登录文件中应该包含下述命令:创建或者修改环境变量的命令(设置 PATH 等变量);执行所有一次性操作的命令。

环境文件有一项不同的任务:设置不能再环境中保存的自定义项,特别是 shell 选项、别名和函数。

初始化文件保存在 home 目录中。

shell 脚本注释

以 #(井号)字符开头的行,称为注释。当执行脚本时,shell 忽略所有的注释,即 # 之后的内容。

相关推荐
律宏阔13 分钟前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔14 分钟前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴14 分钟前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千39 分钟前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3740 分钟前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3740 分钟前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3741 分钟前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
GeW1 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
GeW1 小时前
工业场景中的Linux与数据库选型:高端化转型的技术底座
linux
yunwei371 小时前
eBPF 开发者教程: 简单的 XDP 负载均衡器
linux·后端·性能优化