Shell是一种命令行用户接口,是一种cli(Command   Line Interface)

 

Shell 是Linux系统的用户界面,提供了用户与内核进行交互操作

的一种接口。它接收用户输入的命令并把它送入内核去执行。

shell也被称为LINUX的命令解释器( command interpreter)

shell是一种高级程序设计语言

 

使用echo ${SHELL}显示当前使用的shell类型

显示当前系统支持的所有的shell类型

[root@cos68 ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

其中/sbin/nologin表示非登录用户使用的shell类型,使用此种shell类型的用户无法登录系统,但是可以作为后台服务专用的用户在机器上运行

 

使用set命令显示所有本地定义的Shell变量

 

PS1这个变量中定义了提示符的值

显示命令提示符的格式

echo $PS1

 

  键入命令后,回车,shell程序找到键入命令所对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来。

  在shell中可执行的命令有两类:内部命令和外部命令

内部命令:是shell内部自带的命令,系统启动后,加载对应的shell程序,shell程序被加载后,所有内部命令都会被加载到内存中,bash的文件为/bin/bash,所以如果用户使用bash登录,所有内建在/bin/bash中的命令都会在启动时加载,enable 命令可以启用或禁用内部命令

 

外部命令:在当前系统的某文件系统路径下有对应的可执行程序文件,外部命令在运行的时候加载到内存中,当第一次执行外部命令,会去找到对应的外部命令的文件,加载到内存,当第二次执行同样的外部命令,就不用再次去找对应的文件,因为已经缓存在内存中,直接从内存执行即可;

 


 

使用type命令区别当前使用的命令是内部或外部命令

如果是内部命令,返回命令时shell的内建命令

#type cd

cd is a shell builtin

 

如果是外部命令,返回命令对应的外部文件

#type ifconfig

ifconfig is /sbin/ifconfig

 

 


 

使用which命令区别当前使用的命令是内部或外部命令

which命令会在PATH变量设置的所有路径中逐个搜索我们要查找的命令,比如,which ifconfig,which就会去path环境变量里的路径中逐个寻找ifconfig,path中有多个路径,那么which就一个一个找,如果在前面的路径中找到ifconfig,即使后面的路径中还有ifconfig,which也会返回前面的,默认设置下which找到第一个就不会再向下找了,如果想要which返回path中所有匹配到的值,而不只是第一个,可以使用which -a ,所以说,如果PATH环境变量中如果配置不同,那么使用which命令去找同一个命令,结果也有可能不同。

 

那么我们使用whichcd 看看有什么效果

[root@cos68 /]# which cd

/usr/bin/which: no cd in (/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)

返回nocd in,证明使用which没有找到cd,这是正常现象,因为which是去环境变量里面找的,而cd命令是shell内建命令,所以找不到才是正常的。

 

whereis命令是基于程序名搜索的,whereis只搜索二进制文件(使用参数-b)、man说明文件(使用参数-m)和源代码文件(使用参数-s)如果省略参数,则返回所有信息。

whereis查找的速度比find块,是因为linux会将系统中的文件记录在数据库文件中,当使用whereis时,会从数据库中查找数据。

但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此在使用whereis查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。

 


hash命令:

命令缓存,显示已经缓存的外部命令

hash -d 命令  删除指定的已经缓存的外部命令,例:hash -d ifconfig

hash -r 删除所有已经缓存的外部命令

hash命令只会缓存外部命令,但是,如果以绝对路径执行外部命令,hash也不会进行缓存,也就是说,如果一个外部命令文件所在位置在path环境变量的路径中,直接执行这个外部命令,hash会缓存,如果以绝对路径执行这个外部命令,hash则不会缓存。

 


  当我们键入命令后,敲回车,shell会先判断此命令是否为内部命令,如果是内部命令,直接执行,如果不是内部命令,就去查找内存中外部命令的缓存,如果外部命令的缓存中也没有这个命令,就去按照PATH环境变量中的路径顺序,逐个路径中扫描是否有这个外部命令,如果有这个外部命令,则加载到内存中执行,下次再执行同样的命令,就不用再去查找命令文件了,直接从内存的缓存中即可找到这个外部命令,如果环境变量的路径中也没有这个路径,则报错。

  所以,总上所述,当我们在shell中键入一个命令执行的时候,它的查找优先级如下

1 是否为内部命令,是:执行;  不是:走第2步

2 内存中是否有这个外部命令的缓存,有:执行;  没有:走第3步

3 环境变量中配置的路径中,是否包含此外部命令,包含:执行;  不包含:报错

 

上述shell判断命令的顺序为没有命令别名的情况,。

而如果我们输入的命令是一个命令别名,那么这个别名的优先级比内部命令还要高,也就是说,实际上我们键入一个命令后,shell判断这个命令的顺序是这样的

1这个命令是否在别名中定义,是:执行;  不是:走第2步

2 是否为内部命令,是:执行;  不是:走第3步

3内存中是否有这个外部命令的缓存,有:执行;  没有:走第4步

4 环境变量中配置的路径中,是否包含此外部命令,包含:执行;  不包含:报错

 


 

上面提到命令的别名,我们可以通过alias命令定义和取消定义别名

alias命令别名

alias  CMDALIAS='CMD [OPTIONS] [ARGUMENTS]'

例如将clear命名为cls

alias cls='clear'

但是,这样重命名只对当前bash有效,如果想让别名永久生效,需要修改bash的配置文件/etc/bashrc或者~/.bashrc,修个这两个文件的区别在于前者是系统全局设置,设置完成后所有用户生效,后者是某个用户家目录中的设置,只对设置的用户有效。

 

如果想将当前bash的别名取消。

使用unalias即可

例如 unaliascls

 

如果别名与原名一样,使用\CMD,使用源命令,反斜杠加源命令即可执行原命令

如果别名与原名一样,除了在别名前加\以外,还可以直接单引号,例如'CMD'

 


命令替换

$(command)  或者使用反引号  `command`

把命令中某个子命令替换为其执行结果的过程。

例如

echo"lalala  $(date)"

输出则为lalala当前时间,注意,上述命令使用单引号则不行,需要使用双引号

 

bash支持的引号:

``:反引号,用于命令替换,与$() 效果相同,命令引用

"":双引号,弱引用,可以实现变量替换

'':单引号,强引用,不完成变量替换

 

 


在使用bash的时候有一些快捷键

 

多个命令可以用;符号分开

 一个命令可以用\分成多行,命令转行,命令强制转行

 

光标跳转:

ctrl +a: 跳转命令行首

ctrl+e:跳到命令行尾

ctrl+u:删除光标至命令行首的内容

ctrl+k:删除光标至命令行尾的内容

 

在图形界面的终端中,使用ctrl +左右方向键  支持快速跳到前一个单词或者后一个单词,

但是只是在图形界面的

 

清楚屏幕

ctrl+l或者clear

 

arrow   ctrl-b ctrl-f会向左或向右移动一个字符

Esc-b 左移一个单词

Esc-f 右移一个单词

马哥教育Linux学习笔记

.