Linux shell
😊
1 tty[n]
2 Shell
2.1 shell 介绍
shell
程序的功能:可以提供一个接口,让用户去操作系统。Shell 是命令行解释器,执行用户输入的命令并返回结果。
Linux 提供多种 shell,常见的有 Bourne SHell(sh)、商业上常用的 KSHell、伯克利大学设计的类似于 C 语言的 C shell(依附于BSD,Sun 公司操作系统预设 csh)——csh、tcsh 是增强型的 csh、Linux 使用的 Bourne Again SHell(bash)是 sh 的增强版。
系统支持的 shell 的种类在 /etc/shells
文件中可以看到。
1 | [alvin@centos7 root]$ cat /etc/shells |
用户登录系统使用的预设 shell 在 /etc/passwd
账户信息最后一列指定,而最后一列是账号创建时从配置文件获取的。
1 | [alvin@centos7 root]$ cat /etc/passwd |
在 bash
下有许多命令,有的是在 bash
中内建的,有的是外部命令,可以使用 type
命令来进行鉴别:
1 | 选项与参数: |
2.2 bash 环境配置文件
用户登录到系统之后,欢迎界面、系统/用户变量、可执行命令都会根据相关配置文件配置好,以准备好 bash
的操作环境。
这些配置文件分为:系统(全局)配置文件、个人配置文件。
- login shell:取得 bash 时,需要完整的登录过程。比如通过 tty1~tty6 登录系统,需要输入账号和密码。
- non-login shell:取得 bash 不需要重复输入登录动作。比如(1)在桌面右键开启一个终端,就无须输入账号和密码;(2)在当前 bash 中使用
bash
命令,开启一个子进程。
这两种获取 bash 方式的配置文件是不同的:
- login shell:
/etc/profile
:系统配置文件,最好不要修改。每个用户登录 bash 时都会读取该文件。~/.bash_profile
、~/.bash_login
、~/.profile
:用户个人配置文件,可根据需求进行修改。
- non-login shell:
在 CentOS 7.x 中判断 login shell 或 non-login shell 的方法是使用 echo $0
命令。
1 | echo $0 ==> bash, non-login shell |
配置文件 | 范围 | shell 类型 | 描述 |
---|---|---|---|
/etc/profile |
全局 | login shell | 系统配置文件,最好不要修改。每个用户登录 bash 时都会读取该文件。该配置文件设备很多配置,关于环境变量的部分: - PATH:会根据 UID 决定 PATH 变量是否应该包含 sbin 目录(包含有系统命令)。- MAIL:根据不同的用户,设置对应的邮箱目录,即 /var/spool/mail/用户名 。- USER:根据登录用户名称,设置该变量。 - HOSTNAME:根据登录用户执行 hostname 指令的返回值设备该变量。- HISTSIZE:历史命令记录的个数。CentOS 7.x 设定为 1000。 - umask:root 默认为 022,一般用户为 002。 该配置文件还会调用执行其他部分文件中的内容,这些文件包括: 1、 /etc/profile.d/*.sh :会执行该目录下以 .sh 为扩展名的文件。该目录下的 .sh 文件规范了 bash 的颜色、语言、部分命令的别名 alias 等等。2、 /etc/locale.conf :该配置文件由 /etc/profile.d/lang.sh 来调用,该文件中的 LANG/LC_ALL 变量用来设置系统语言。 |
~/.bash_profile ~/.bash_login ~/.profile |
用户 | login shell | bash 执行完 /etc/profile 之后,接着就会读取用户个人的配置文件。系统会按第一列所示顺序读取第一个存在的个人配置为文件(只读取其中一个)。~/.bash_profile 文件中还会调用执行 ~/.bashrc 的内容。 |
在 login shell 环境下,会按如下流程进行配置文件的读取执行(实线表示系统配置 bash 的流程,虚线表示在该文件内容中会调用执行的文件)。可以看到,最终都需要读取到 ~/.bashrc 文件。 |
|||
~/.bashrc |
全局/用户 | non-login shell | 该配置文件中 root 和普通用户稍有不同,root 用户会给 rm/cp/mv 重命名(更加规范)。相同的地方是,都会判断 /etc/bashrc 是否存在,如果存在就会 . /etc/bashrc 让该文件得到执行(文件 /etc/bashrc 是 CentOS 特有的,其他系统可能是其他名称的文件)。/etc/bashrc 主要功能:1、依据不同的 UID 规范出 umask 的值;2、依据不同的 UID 规范出提示字符(就是 $PS1 变量);3、执行 /etc/profile.d/*.sh 的配置。 |
~/.bash_history |
全局/用户 | all | 用于记录上次使用过的命令,不包含本次终端中刚才使用的指令。历史命令可记录的条数定义在变量 HISTFILESIZE 中,CentOS 一般是 1000 。 |
~/.bash_logout |
全局/用户 | all | 当我注销 bash 后,系统再帮我做完什么动作后才离开。 |
由于 /etc/profile
与 ~/.bash profile
都是在取得 login shell 的时候才会读取的配置文件,所以,如果你将自己的偏好设定写入上述的文件后,通常都是得注销再登入后,该设定才会生效。那么有没有不需要注销在登入而直接读取到已修改的配置文件呢?即让修改的配置立即生效的方法,那就是使用 source
或 .
命令(即可以执行从标准输入或文件中读取的命令)。
1 | source 文件名 [参数] |