什么是linux shell


命令行登录系统后,所显示的命令行界面是由shell提供的. shell作为操作系统的外壳,是linux内核与用户交互的桥梁。 命令需要通过shell提供的命令行界面才能执行。 用户以命令行模式登陆后看到的界面即为shell提供的交互界面,如下所示:

                Ubuntu 12.04.1 LTS initroot tty1
 
                initroot login: root
                Password: 

                Last failed login: Mon Dec 30 20:39:54 CST 2019 from 168.181.11.252 on ssh:notty
                There were 14 failed login attempts since the last successful login.
                Last login: Fri Dec 27 11:38:54 2019 from 61.177.142.236

                Welcome to Alibaba Cloud Elastic Compute Service !

                [root@initroot ~]#
            

广义的shell分为两大类:
1.图形界面shell(Graphical User Interface shell 即 GUI shell)
例如windows下的Windows Explorer,linux下的X window manager(BlackBox和FluxBox),以及功能强大的CDE、GNOME、KDE、 XFCE。
2.命令行式shell(Command Line Interface shell ,即CLI shell)
平时提到的shell就是命令行shell。shell作为linux的命令解释器,管理用户与操作系统内核之间的交互: 等待并接收用户输入命令,解释用户输入并调用相应的应用程序,处理各种各样的输出结果。

shell

回到顶部

shell在系统启动的时候由login程序加载执行。
交互式shell和非交互式shell
登录shell和非登录shell
shell可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script非交互方式执行。
交互式模式就是shell等待用户的输入,并且执行用户提交的命令。这种模式被称作交互式。 这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当用户退出,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与用户进行交互,而是读取并执行存放在shell script文件中的命令。 当它读到文件的结尾,shell也就终止了。
shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。
Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。 实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。
不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。
Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
Linux提供了像MicrosoftWindows那样的可视的命令输入界面--X Window的图形用户界面(GUI)。 它提供了很多桌面环境系统,其操作就像Windows一样,有窗口、图标和菜单,所有的管理都是通过鼠标控制。GNOME。 每个Linux系统的用户可以拥有他自己的用户界面或Shell,用以满足他们自己专门的Shell需要。

shell有多种不同的版本,主要有下列几种版本:

Bourne Shell:由贝尔实验室开发;
BASH:是GNU的Bourne Again Shell,是GNU操作系统上的默认shell;
Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容;
C Shell:是SUN公司BSD版本的Shell;
Z Shell:The last shell you’ll ever need! Z是最后一个字母,也就是终极Shell。它集成了bash、ksh的重要特性,同时又增加了自己独有的特性。

Shell最主要的功用就是解译用户在命令列提示符下输入的命令。
Shell 语法分析命令列,把它分解成以空白区分开的符号(token),在此空白包括了跳位键(tab)、空格和换行(New Line)。 如果这些字包含了metacharacter,shell 将会评估(evaluate)它们的正确用法。 另外,shell 还管理文件输入输出及幕后处理(background processing)。在处理命令列之后,shell 会寻找命令并开始执行它们。
Shell 的另一个重要功用是提供个人化的用户环境,这通常在shell的初始化文件中完成(.profile、.login、.cshrc、.tcshrc等等)。 这些文件包括了设定终端机键盘和定义窗口的特征;设定变量,定义搜寻路径、权限、提示符号和终端机类型; 以及设定特殊应用程序所需要的变量,例如窗口、文字处理程序、及程序语言的链接库。 Korn shell 和 C shell 加强了个别化的能力:增加历程、别名、和内建变量集以避免用户误杀文件、不慎签出、并在当工作完成时通知用户。 Shell 也能当解译性的程序语言(interpreted programing language)。
Shell程序,通常叫做命令文件,它由列在文件内的命令所构成。 此程序在编辑器中编辑(虽然也可以直接在命令列下写作程序,online scripting),由UNIX命令和基本的程序结构,例如变量的指定、测试条件、和循环所构成。 您不需要编译 shell 命令档。Shell 本身会解译命令档中的每一行,就如同由键盘输入一样。 shell负责解译命令,而用户则必须了解这些命令能做什么。下面列出了一些有用的命令和它们的使用方法。

shell作为Linux操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。
shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。
当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。
shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。 有一些命令,比如改变工作目录命令cd,是包含在shell内部的。还有一些命令,例如拷贝命令cp和移动命令mv,是存在于文件系统中某个目录下的单独的程序。
对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。
shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序 (这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs)。
然后shell在搜索路径里寻找这些应用程序。
如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。
如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。
shell的另一个重要特性是它自身就是一个解释型的程序设计语言, shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。
shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。
当普通用户成功登录,系统将执行一个称为shell的程序。正是shell进程提供了命令行提示符。
默认情况下,对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。 一旦出现了shell提示符,就可以键入命令及命令所需要的参数。shell将执行这些命令。
如果一条命令花费了很长的时间来运行,或者在屏幕上产生了大量的输出,可以从键盘上按ctrl+c发出中断信号来中断它。
当用户准备结束登录对话进程时,可以键入logout命令、exit命令或文件结束符(EOF)(按ctrl+d实现),结束登录。
我们来实习一下shell是如何工作的。

              peter@www:~$ make work
              make: *** No rule to make target 'work'. Stop.
              peter@www:~$ 
            
make是系统中一个命令的名字,后面跟着命令参数。在接收到这个命令后,shell便执行它。本例中,由于输入的命令参数不正确,系统返回信息后停止该命令的执行。
shell会寻找名为make的程序,并以work为参数执行它。make是一个经常被用来编译程序的程序,它以参数作为目标来进行编译。
在“make work”中,make编译的目标是work。因为make找不到以work为名字的目标,它便给出错误信息表示运行失败,用户又回到命令提示符下。
用户键入命令后,shell如果找不到以命令名为名的程序文件,就会给出错误信息。例如,如果用户键入:
              peter@www:~$ myprog
              bash:myprog:command not found
              peter@www:~$ 
            
可以看到,用户得到了一个没有找到该命令的错误信息。用户敲错命令后,系统一般会给出这样的错误信息。

为何要学shell?

回到顶部

文字接口的 shell:大家都一样!
通过X Window或者Web接口的图形界面管理工具可以非常快速方便的对linux进行设置, 例如Webmin就是一款非常好用的基于web的linux系统设置工具,甚至一些非常复杂的设置都可以轻松搞定! 但是我们为什么还要用命令行的shell呢?
虽然X Window 与 web 接口的工具简单易用功能强大,但毕竟他是将所有利用到的软件都整合在一起的一组应用程序而已, 并非是一个完整的套件,所以某些时候当用户升级或者是使用其他套件管理模块 (例如 tarball 而非 rpm 文件等等) 时,就会造成设定的困扰了。 甚至不同的 distribution 所设计的 X window 接口也都不相同,这样也造成学习方面的困扰。
文字接口的shell就不同了!几乎所有的linux发行版distributions使用的bash都是一样的! 这样掌握了bash的操作技能就可以在各个linux发行版之间无缝切换了,正所谓一法通、万法通!
远程管理:文字接口就是比较快!
我们经常需要远程连接linux服务器,虽然已经出现了非常多的图形界面远程连接工具,但是毕竟文字的传输速度又要远远大于图形的传输。 所以使用文件接口的shell在远程连接的时候操作更加快速稳定。
学习文字接口的shell也可以更深入的了解linux,可以接触到更多深层次原理性的东西。而如果只是用图形界面的话,除了只会动动鼠标, 看上去简单又轻松,但是真的是错了深入学习linux的大好机会了。
Linux 的任督二脉: shell 是也!
在linux主机运维工作中,编写shell脚本是每个系统管理员的基本功,例如系统管理员经常要做的一件工作就是查看系统的日志文件, 如果管理的主机非常多,每个主机都要花上几十分钟来查阅日志文件!那真的是效率太低下了。 这时候用shell提供的数据流重导向以及管道命令,只需要花费不到十分钟就可以看完所有linux主机的日志文件信息了!
作为linux系统管理员,shell和shell scripts是必须要认真掌握的必备技能!

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读