认识 Bash

247 阅读4分钟

认识 BASH 这个 Shell

管理和调度整个计算机硬件的是操作系统的核心(操作系统中包含许多程序,核心只是其中一部分),核心被保护起来,进入操作系统后与用户进行交互的是 shell 程序(对于用户而言,使用操作系统时最直接接触的交互界面是由 shell 提供的)或者KDE、具体application应用程序,向应用程序中输入指令,指令经过转换最后传达给核心,核心调度硬件工作,并且将命令执行结果展示出来,反馈给用户。

硬件、核心、shell

只要是操作系统那就离不开 shell (不论是 Windows、Unix 还是 Linux)

当计算机发出声音时,需要具备的条件:

  1. 硬件:硬件必须有声卡芯片
  2. 核心管理:核心能够支持这个芯片组,还需要提供芯片的驱动程序(核心提供了拓展开发的接口,硬件厂商根据接口开发驱动程序)
  3. 应用程序:使用者在应用程序中输入发出声音的指令

操作系统的核心不可能让普通用户随意操作,所以在操作系统上发展应用程序,用户可以通过应用程序来与核心沟通,完成所需的硬件任务。壳程序其实是提供给用户的一个交互界面(或者叫平台),在这个平台上来操作系统,在操作系统的过程中可能需要调用其他已经实现具体功能的应用程序,包括 man,chmod,chown,vi,fdisk,mkfs 等指令都是独立的应用程序。但是我们可以通过壳程序来调用这些程序与核心沟通完成工作

广泛的说只要能够操作应用程序的接口都能够称为壳程序,狭义的壳程序指的是命令行方面的软件,例如要介绍的 bash 。广义的壳程序则包括图形界面的软件。壳程序本身就是一个应用程序,只是这个应用程序比较特殊,它主要是提供给用户一个交互界面用来操作其应用程序。

系统合法 shell 与 /etc/shells

shell 有许多不同的版本,Linux 预设使用的是 bash 这个 shell,它是基于 GNU 框架发展出来的

CentOS 7.x 发行版内置多少种可以使用的 shell 程序?可以检查 /etc/shells 这个文件,这个文件中记录了系统中合法的 shell 版本,例如下面几个 shell

  • /bin/sh(已经被 /bin/bash 所取代)
  • /bin/bash(就是 Linux 预设使用的 shell)
  • /bin/tcsh(整合 C Shell ,提供更多功能)
  • /bin/csh(已经被 /bin/tcsh 所取代)
  • /usr/sbin/nologin
  • /sbin/nologin

虽然各家 shell 的功能差不多,但是在某些语法的下达方面有所不同,为什么系统上的可用 shell 要写到 /etc/shells?这是因为系统某些服务在运行过程中,会去检查能够使用的 shell ,而这些 shell 的查询就是凭借这个文件

那么用户在什么时候?预设会取得哪种 shell 来工作?当用户登入 Linux 后,系统就会给用户一个 shell 来进行工作,而不同用户默认取得的 shell,记录在 /etc/passwd 这个文件中

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
....

每一行最后的数据,就是用户登入后取得的预设 shell

查询指令是否为 Bash shell 的内建指令:type

使用 type 这个指令来观察指令是 bash 的内建指令还是外部指令

[root@study ~]# type [-tpa] name
选项与参数:
	:不使用任何选项和参数时,会显示出 name 是 bash 内建指令还是外部指令
-t	:当加入 -t 参数时,将会使用以下单词来代表 name 的意义
	 file	:表示 name 为外部指令
	 alias	:表示 name 为命令别名
	 builtin:表示 name 为 bash 的内建指令
-p	:后面接的 name 为外部指令,会显示完整文件名
-a	:会将 PATH 变量定义的路径中所有含有 name 的指令都列出来,包括 alias

查询 ls 这个指令是否为 bash 内建
[root@study ~]# type ls
ls 是 `ls --color=auto' 的别名
[root@study ~]# type -t ls
alias
[root@study ~]# type -a ls
ls 是 `ls --color=auto' 的别名
ls 是 /usr/bin/ls
ls 是 /bin/ls

[root@study ~]# type cd
cd 是 shell 内嵌

使用 type 指令可以知道一个指令是内建指令,还是外部指令,不过知道是内建指令还是外部指令有什么意义吗?内部指令和外部指令有什么不同吗?type 指令后面接的文件名是执行文件时才会显示信息,如果只是一般文件名的话,不会显示任何信息