【第十章】认识与学习BASH

认识BASH这个Shell

硬件、核心与Shell

一、当你要计算机传输出来“音乐”的时候,你的计算机需要:

  1. 硬件:需要你的硬件有声卡芯片这个配备,否则怎么会有声音;
  2. 核心管理:操作系统的核心可以支持这个芯片组,当然还需要提供芯片的驱动程序啰;
  3. 应用程序:需要使用者 (就是你) 输入发生声音的指令啰!

也就是说,你必须要“输入”一个指令之后, “硬件”才会通过你下达的指令来工作!那么硬件如何知道你下达的指令呢?那就是kernel(核心)的控制工作了!也就是说,我们必须要通过“Shell”将我们输入的指令与Kernel沟通,好让Kernel可以控制硬件来正确无误的工作!我们可以通过下面这张图来说明一下:
在这里插入图片描述
二、操作系统其实是一组软件,由于这组软件在控制整个硬件与管理系统的活动监测,如果这组软件能被使用者随意的操作,若使用者应用不当,将会使得整个系统崩溃!但是我们总是需要让使用者操作系统的,所以就有了在操作系统上面发展的应用程序啦!使用者可以通过应用程序来指挥核心,让核心达成我们所需要的硬件任务!
三、其实shell的功能只是提供使用者操作系统的一个接口,因此shell需要可以调用其他软件才好。我们前面提到的指令man、chmod、chown、vi、fdisk、mkfs等,都是独立的应用程序,但是我们可以通过shell(就是命令行界面) 来操作这些应用程序,让这些应用程序调用核心来运行所需的工作哩!
四、也就是说,只要能够操作应用程序的接口都能够称为shell。狭义的shell指的是命令行方面的软件,包括本章要介绍的bash等。 广义的shell则包括图形接口的软件!因为图形接口其实也能够操作各种应用程序来调用核心工作啊!

系统的合法shell与/etc/shells功能

一、目前Linux(以CentOS 7.x为例)有多少我们可以使用的shells呢? 你可以检查一下 /etc/shells 这个文件,至少就有下面这几个可以用的 shells (鸟哥省略了重复的 shell 了!包括 /bin/sh 等于 /usr/bin/sh 啰!):
通过检查/etc/shells文件,可以查看Linux(以CentOS 7.x为例)中有多少我们可以使用的shells:

/bin/sh (已经被 /bin/bash 所取代)
/bin/bash (就是 Linux 默认的 shell)
/bin/tcsh (整合 C Shell ,提供更多的功能)
/bin/csh (已经被 /bin/tcsh 所取代)
# 省略了重复的shell,包括/bin/sh等于/usr/bin/sh

为什么我们系统上合法的shell要写入/etc/shells这个文件?因为系统某些服务在运行过程中,会去检查使用者能够使用的shells,而这些shell的查询就是借由/etc/shells这个文件啰!某些FTP网站会去检查使用者的可用shell,而如果你不想要让这些使用者使用FTP以外的主机资源时,可能会给予该使用者一些怪怪的shell,让使用者无法以其他服务登陆主机。这个时候,你就得将那些怪怪的shell写到/etc/shells当中了。
二、当我登陆的时候,系统就会给我一个shell让我来工作了。 而这个登陆取得的shell就记录在/etc/passwd这个文件内!这个文件的内容:

[dmtsai@study ~]$ cat /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
.....(下面省略).....

在每一行的最后一个数据,就是你登陆后可以取得的默认的shell啦!那你也会看到,root是/bin/bash,不过,系统帐号bin与daemon等等,就使用那个怪怪的/sbin/nologin

Bash shell的功能

一、bash主要相容于sh,其主要优点:

  1. 命令编修能力(history):他能记忆使用过的指令,我只要在命令行按上下键就可以找到前/后一个输入的指令!而在很多distribution里头,默认的指令记忆功能可以到达1000个,这么多的指令记录在你的主文件夹内的.bash_history啦!不过~/.bash_history 记录的是前一次登陆以前所执行过的指令,至于这一次登陆所执行的指令都被暂存在内存中,当你成功的登出系统后,该指令记忆才会记录到.bash_history当中!
  2. 命令与文件补全功能:([tab] 按键的好处)
    (1)[Tab] 接在一串指令的第一个字的后面,则为命令补全;
    (2)[Tab] 接在一串指令的第二个字以后时,则为“文件补齐”!
    (3)若安装bash-completion软件,则在某些指令后面使用[tab]按键时,可以进行“选项/参数的补齐”功能!
    例如:查看环境当中所有以c开头的指令:按下c[tab][tab]
  3. 命令别名设置功能(alias):假如我想用lm这个自定义的命令来取代ls -al,以查看本目录下面的所有文件及其属性(包含隐藏文件),也就是说,lm等同于ls -al。可以使用alias来实现!在命令行输入alias可查看目前的命令别名有哪些,也可以直接下达命令来设置别名:alias lm='ls -al'
  4. 程序化脚本(shell scripts):
  5. 万用字符(Wildcard):想要知道/usr/bin下面有多少以X为开头的文件:ls -l /usr/bin/X*

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

一、查看bash的说明文档:man bash。这个说明文档里面有其他的文件说明,因为为了方便shell的操作,bash内置了很多指令了。利用type指令可以知道某个指令是来自于外部指令(指的是其他非bash所提供的指令)或是内置在bash当中的:

[root@www ~]type [-tpa] name
# 选项与参数:
# :不加任何选项与参数时,type会显示出name是外部命令还是bash内建命令
# -t:当加入-t参数时,type会将name以底下这些字眼显示出他的意义:
#      file:表示为外部命令;
#      alias:表示该命令为命令别名所配置的名称;
#      builtin:表示该命令为bash内建的命令功能;
# -p  :如果后面接的name为外部命令时,才会显示完整文件名;
# -a  :会由PATH变量定义的路径中,将所有含name的命令都列出来,包含alias

# 范例一:查询一下ls这个命令是否为bash内建?
[root@www ~]type ls
ls is aliased to `ls --color=tty' <==未加任何参数,列出ls的最主要使用情况
[root@www ~]type -t ls
alias                             <==仅列出ls运行时的依据
[root@www ~]type -a ls
ls is aliased to `ls --color=tty' <==最先使用aliase
ls is /bin/ls                     <==还有找到外部命令在/bin/ls

# 范例二:cd呢?
[root@www ~]type cd
cd is a shell builtin             <==看到了吗?cd是shell内建命令

二、由于利用type搜寻后面的名称时,如果后面接的名称并不能以可执行文件的状态被找到,那么该名称是不会被显示出来的。也就是说,type主要在找出“可执行文件”而不是一般文件文件名喔!所以,typ 也可以用来作为类似which指令的用途啦!找指令用的!

指令的下达与快速编辑按钮

一、

# 范例:如果命令串太长的话,如何使用两行来输出?
[vbird@www ~]cp /var/spool/mail/root /etc/crontab \
> /etc/fstab /root

上面这个指令将三个文件复制到/root目录下。不过,因为指令太长,可以利用[Enter]来将[Enter]这个按键“跳脱!”开来,让[Enter]按键不再具有“开始执行”的功能!好让指令可以继续在下一行输入。 需要特别留意,[Enter] 按键是紧接着反斜线(\)的,两者中间没有其他字符。 因为\仅跳脱“紧接着的下一个字符”而已!所以,万一我写成:\ [Enter],亦即[Enter]与反斜线中间有一个空格时,则\跳脱的是“空白键”而不是[Enter]按键!
二、组合键

组合键 功能与示范
[ctrl]+u/[ctrl]+k 分别是从光标处向前删除指令串([ctrl]+u)及向后删除指令串([ctrl]+k)
[ctrl]+a/[ctrl]+e 分别是让光标移动到整个指令串的最前面([ctrl]+a)或最后面([ctrl]+e)

Shell的变量功能

猜你喜欢

转载自blog.csdn.net/CaraYQ/article/details/127995730
今日推荐