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学习笔记
.