Shell定义
Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
关于解释器:
解释器(英语:Interpreter),又译为直译器,能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位"中间人",每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。
linux命令有多重,可能是shell内建的,也可能是外部的命令,可以通过type -a 命令查看。
[root@localhost ~]# type -a cd cd 是 shell 内嵌 cd 是 /usr/bin/cd [root@localhost ~]# type -a mkdir mkdir 是 /usr/bin/mkdir [root@localhost ~]# type -a ll ll 是 `ls -l --color=auto' 的别名 [oracle@localhost ~]$ type -a type type 是 shell 内嵌 [root@localhost testsh]# which type /usr/bin/which: no type in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) |
shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs)。然后shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。
注意:shell内嵌的命令是无法通过which找到的。
普通用户成功登录,系统将执行一个称为shell的程序。正是shell进程提供了命令行提示符。作为默认值(TurboLinux系统默认的shell是BASH),对普通用户用"$"作提示符,对超级用户(root)用"#"作提示符。
shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。
shell种类(了解)
- Bourne Shell:是贝尔实验室开发的。也就是sh。
- BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell。兼容sh。
- Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。
- C Shell:是SUN公司Shell的BSD版本。
- Z Shell:The last shell you'll ever need! Z是最后一个字母,也就是终极Shell。它集成了bash、ksh的重要特性,同时又增加了自己独有的特性。
bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行。我们下面都是在介绍bash。
默认shell
每个用户通过终端登录后,会根据passwd文件中的配置,使用相应的shell。
如下:
[oracle@localhost ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
zjf:x:1000:1000:zjf:/home/zjf:/bin/bash
oracle:x:1001:1001::/home/oracle:/bin/bash
redis:x:1002:1003::/home/redis:/bin/bash
mysql:x:992:990:MySQL server:/var/lib/mysql:/bin/bash
其中,/sbin/nologin代表这个账号是辅助账号,不会登录。所以没有shell配置。