Bourne shell
Bourne shell是由Stephen Bourne在1979年开发的一种命令行解释器(shell),它是Unix系统上最早的标准shell。Bourne shell的可执行文件路径通常为/bin/sh。
Bourne shell提供了一种交互式和脚本编程环境,用户可以通过命令行界面与操作系统进行交互,并执行各种任务。它支持常见的shell语法,如变量赋值、条件语句、循环结构和命令执行等。
Bourne shell的语法相对简单,不像后续的shell如Bash或Zsh那样提供了大量的扩展功能。然而,由于其广泛的兼容性和较低的资源消耗,Bourne shell仍然在一些嵌入式系统和较旧的Unix系统中得到广泛使用。
虽然Bash是Bourne shell的一个扩展版本,但它并不是严格的Bourne shell。Bash在语法和功能上扩展了Bourne shell,并提供了许多新特性和改进,因此在大多数情况下,Bash可以替代Bourne shell并执行Bourne shell脚本。
Bourne compatible shells
Bourne兼容的shell是一类Unix/Linux操作系统上的命令行解释器(shell),它们遵循了基于Bourne shell的语法和行为。
Bourne shell的语法和行为成为了许多后来的shell的基础,因此出现了很多与Bourne shell兼容的shell。其中一些常见的Bourne兼容的shell包括:
- Bash(Bourne Again SHell):Bash是Bourne shell的扩展版本,遵循GNU通用公共许可证(GPL). 它是
目前大多数Linux系统默认的shell,并且也可在其他Unix系统上使用, 包括Linux、Unix和Mac OS X等。 - Zsh(Z Shell):Zsh是一个功能丰富的shell,它在Bourne shell的基础上增加了许多新特性和改进。
- Ksh(Korn Shell):Ksh是Bourne shell的扩展版本,它提供了更多的功能和改进的交互性。
- Dash:Dash是一个轻量级的Bourne shell替代品,它专注于快速启动和执行脚本的能力。
…
/etc/profile
/etc/profile是一个系统范围的Shell配置文件,它在用户登录时被加载和执行。该文件通常用于设置系统范围的环境变量、路径配置和其他全局的Shell设置。
当用户登录时,系统会首先加载/etc/profile文件,然后加载用户的个人配置文件(如~/.bash_profile或~/.profile)。这些配置文件会为每个登录用户提供自定义的环境变量和Shell设置。
1 | # /etc/profile: system-wide .profile file for the Bourne shell (sh(1)) |
这段默认脚本首先通过if [ “$(id -u)” -eq 0 ]; then判断当前用户是否为root用户。如果是root用户,则将PATH设置为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,否则将PATH设置为/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games。
接下来,判断命令行提示符PS1(Prompt String 1)是否已经被设置。如果已经设置,则检查当前Shell是否为Bash,并且不是以/bin/sh作为Bash解释器。如果是这样,则不修改PS1,并且尝试加载/etc/bash.bashrc文件。如果/etc/bash.bashrc存在,则将其包含到当前Shell配置中。
如果PS1未被设置,则根据当前用户是否为root用户,设置PS1为’# ‘(root用户)或’$ '(非root用户),用作命令行提示符。
最后,检查是否存在/etc/profile.d目录。如果存在,则遍历该目录下的所有.sh文件,并加载每个文件中的配置。
Shell 分类
以上是按照Shell的不同实现特点和变体版本能分得到 Bourne Shell(sh), Bourne compatible shells(bash, zsh, ash…)
按是否登录和交互又能分为:
登陆的维度划分:login shell , non-login shell
交互的维度划分:interactive shell , non-interactive shell
login shell: 需要用户名、密码登录后才能进入的shell。在大多数情况下 ,远程终端工具(secureCRT xshell putty)通过ssh连接都是login shellnon-login shell: 一般是在图形界面中启动一个终端shell 或者在login shell终端输入shell对应路径会打开一个临时shell
通过su username 切换到用户得到一个non-login shell; su - username 切换可以获得一个login shell
在login模式下 通过输入bash即可打开一个non-login shell 如果是bash --login 则打开一个login shell
interactive shell: 在大多数远程工具连接服务器后打开的都是interactive shell( 交互式shell ) 改模式下,shell等待你输入命令并解释和执行这些命令,然后继续等待下一个命令。non-interactive shell: 一般是指执行shell脚本时的模式,通过bash test.sh这种形式执行脚本文件,它并不与用户交互 而是一次性执行脚本 当脚本执行完毕 shell即终止。
一般以"#!/bin/bash" 开头的shell脚本是non-login non-interactive shell
如果以"#!/bin/bash --login"开头的shell脚本时login non-interactive shell
查看和切换SHELL
1 | # 查看当前shell |
SHELL配置文件的读取
/etc/profile全局系统配置会首先读取
然后读取各自的用户配置文件, 如bash:
.bashrc是Bash Shell的配置文件,它在每次打开新的终端窗口时加载。它通常包含设置个人环境变量、路径配置、命令别名、自定义函数等的命令。~/.bashrc文件会去加载/etc/bashrc.
对于bash, non-login shell只会读取.bashrc; non-interactive non-login shell 不读取任何配置文件,而是会读取环境变量 BASH_ENV所指向的脚本文件
~/.profile. ~/.bash_profile ~/.bash_login 都这三个文件基本都是去加载.bashrc, 只会读取一个
-
.profile是一个通用的Shell配置文件,它在用户登录时加载,无论使用的是那种shell. -
.bash_profile这是Bash Shell的另一个配置文件,它在用户登录时加载,类似于.profile。在某些系统中,.bash_profile会优先于.profile加载。 -
.bash_login:这也是Bash Shell的配置文件之一,它在用户登录时加载 -
.bash_logout: 当每次退出系统(退出bash shell)时, 执行该文件.
其他不同类型的shell
.zshrc是Zsh Shell的配置文件,它也在每次打开新的终端窗口时加载..cshrc是C Shell(csh)的配置文件,.tcshrc是TC Shell(tcsh)的配置文件.kshrc是Korn Shell(ksh)的配置文件~/.config/fish/config.fishFish Shell 配置文件
参考