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
2
3
4
5
6
7
[alvin@centos7 root]$ cat /etc/shells
/bin/sh // 链接
/bin/bash // 链接
/usr/bin/sh // 已经被 /bin/bash 所取代
/usr/bin/bash // Linux 预设的 shell
/bin/tcsh // 整合 C Shell,提供更多的功能
/bin/csh // 已经被 /bin/tcsh 所取代

用户登录系统使用的预设 shell 在 /etc/passwd 账户信息最后一列指定,而最后一列是账号创建时从配置文件获取的。

1
2
[alvin@centos7 root]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash

bash 下有许多命令,有的是在 bash 中内建的,有的是外部命令,可以使用 type 命令来进行鉴别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
选项与参数:
:不加任何选项与参数时,type 会显示出 name 是外部指令还是 bash 内建指令
-t :当加入 -t 参数时,type会将 name 以底下这些字眼显示出他的意义:
file:表示为外部指令;
alias:表示该指令为命令别名所设定的名称:
builtin:表示该指令为 bash 内建的指令功能;
-p :如果后面接的 name 为外部指令时,才会显示完整文件名:
-a :会由 PATH 变量定义的路径中,将所有含 name 的指令都列出来,包含 alias

// 举例说明
[root@centos7 ~]# type ll
ll is aliased to 'ls -l --color=auto'

[root@centos7 ~]# type -t ll
alias

[root@centos7 ~]# type -p ls

[root@centos7 ~]# type -a ls
ls is aliased to 'ls --color=auto'
ls is /usr/bin/ls
ls is /bin/ls

[root@centos7 ~]# type cd
cd is a shell builtin // 内建

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
2
echo $0 ==> bash, non-login shell
echo $0 ==> -bash, 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 文件
24.png
~/.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
2
3
source 文件名 [参数]
[root@centos7 ~]# source ~/.bash_profile
[root@centos7 ~]# . ~/.bash_profile