什么是 shell和bash?
我看了这位大佬的一篇文章,感觉不错,有助于各位理解
https://www.jianshu.com/p/a702a01db5c7
基础特性一
history命令:
命令历史:shell进程会在其会话中保存此前用户提交过的命令
可以使用 ~]# history 查看
定制history的功能,可以通过环境变量实现。
HISTSIZE:shell进程可以保留的命令历史的条数 ~]# echo $HISTSIZE 1000 显示可以保留的历史纪录为1000条命令
HISTFILE: 持久保存命令历史的文件 对于每个用户来讲都时保存自己的文件 .bash_history
每一个用户命令历史的shell首先会从.bash_history 中加载命令历史文件到内存中,而后新执行的命令会补加在内存中
所以history 看到的是整个内存中的命令。 注意文件中不会保留下来刚刚执行的命令
HISTFILESIZE:存储历史命令的文件的大小
选项:-c 清空所有历史命令 ~]# history -c
-d offset n 清空指定行的命令 ~]# history -d 164 清空从164行开始10行的命令 ~]# history -d 164 10
-r 从文件读取命令历史到历史列表(内存)中
-w 把历史列表中(内存)的命令追加到历史文件中
~]# history 10 显示最近的十条命令
调用命令历史列表中的命令
!#:再一次执行历史列表中的第#条命令 ~]# !174
!!:再一次执行上一条命令 ~]# !!
!String:再一次执行命令历史列表中最近一个以String开头的命令 ~]# !ca
命令的重复执行需要依赖于幂等性
调用上一条命令的最后一个参数
先执行 ~]# ls /etc/sysconfig/network-scripts
后执行 ~]# ll /etc/sysconfig/network-scripts
想要快速获取上一条命令后面跟的参数 使用ESC(按一下松开)然后按.号
第二种方法 ~]# ll !$ !$ 可以获取上一条命令后面的参数
控制命令历史记录的方式
环境变量:HISTCONTROL ~]# echo $HISTCONTROL ignoredups 忽略重复命令
ignoredups :忽略重复命令
ignorespace:忽略以空白字符开头的命令
ignoreboth:以上两者同时生效
修改HISTCONTROL ~]# HISTCONTROL=ignorespace 只对当前shell有效,重启或者登录其他用户无效
基础特性二
命令补全:
shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当做命令
命令处理机制:
先查找内部命令,
如果没有则根据PATH环境变量中设定的目录,/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
自左而右逐个搜索目录下的文件名,找到第一个匹配的启动为一个进程
命令补全:
给定的打头字符串能被唯一确定 则单机TAB键之后 会自动补全命令
如果无法唯一确定,则单击两次TAB键,会以列表的形式列出所有命令
路径补全:
在给定的起始路径下,以对应路径下的打头字符串来逐一匹配起始路径下的每个文件
单击TAB,如果能唯一标识,直接补全,否则再按一次TAB,给出列表
基础特性三
命令行自动展开
~:自动展开为用户的家目录
{}:可承载一个以逗号分隔的路径列表,并能够展开为多个路径
例如:/tmp/{a,b} 相当于/tmp/a,/tmp/b
]# mkdir -p /tmp/x/{y1/{a,b},y2} 在tmp/x下创建 y1,y2其中y1下创建a,b
]# mkdir -v {a,b}_{c,d} 在当前目录下创建a_c,a_d,b_c,b_d
创建如下目录结构
tmp
├── mysysroot
│ ├── bin
│ ├── etc
│ │ └── sysconfig
│ │ └── network-scripts
│ ├── sbin
│ ├── usr
│ │ ├── bin
│ │ ├── lib
│ │ ├── lib64
│ │ ├── local
│ │ │ ├── bin
│ │ │ ├── etc
│ │ │ ├── lib
│ │ │ └── sbin
│ │ └── sbin
│ └── var
│ ├── cache
│ ├── log
│ └── run
]# mkdir -pv mysysroot/{bin,sbin,etc/sysconfig/network-scripts,usr/{bin,sbin,local/{bin,sbin,etc,lib},lib,lib64},var/{cache,log,run}}
tree命令:树形结构显示目录结构
选项:
]# tree -L 2 /tmp/ -L:以树状结构最多显示两层
基础特性四
命令执行的状态结果
命令执行的状态结果:bash通过状态返回值来输出此结果,成功0,失败1-255其中的一个值,命令执行完成后
其状态返回值保存于bash的特殊变量$?中
~]# echo $? 显示:0
执行一个错误命令 ~]#lsss /etc 然后执行~]# echo $? 显示:127 只返回上条执行的命令的状态结果
命令正常执行时,有的会有命令返回值,根据命令及其功能不同,结果各不相同,不是状态结果
引用命令的执行结果
$(COMMOND) 或者 `COMMOND`
例如创建一个当前时间为目录名的目录:~]# mkdir $(date +%H-%M-%S)
基础特性五
引用
强引用:‘’ 其内部的任何字符串都直接显示,不做任何替换
弱引用:"" 弱引用中的变量名会做变量替换,替换为变量中所存储的值
命令引用:`` 或 $()
基础特性六
快捷键:
ctrl + a: 在输入命令时,跳转到命令行首
ctrl + e: 在输入命令时,跳转到命令行尾
ctrl + u: 在输入命令时,删除命令行首到光标位置的所有内容
ctrl + k: 在输入命令时,删除光标位置到命令行尾的所有的内容
ctrl + l: 清屏 相当于clear
基础特性七
globbing:文件名通配(整体文件名匹配),一种匹配模式,
元字符:metacharacter
指的是一个字符出现以后,并不表示字符本身的意义,而是用来匹配一定范围内的,或者指定范围内的字符
*,匹配任意长度的任意字符串,例如查看/etc/所有pa打头的文件 ~]# ls /etc/pa*
?,表示匹配任意单个字符
[]:匹配指定范围内的任意单个字符,有几种特殊格式
[a-z],[A-Z],[0-9],[a-z0-9],
[[:upper:]] 表示所有大写字母 查看以大写字母开头中间两位数字结尾为a的文件 test]# ls [[:upper:]][0-9][0-9]a
[[:lower:]] 表示所有小写字母 [[:alpha:]] 表示所有字母 [[:digit:]]表示所有数字
[[:alnum:]] 表示所有的字母和数字 [[:space:]] 表示所有空白字符 [[:punct:]] 表示所有标点符号
[^]:匹配指定范围之外的任意单个字符
[^[:upper:]]匹配任意大写字母范围之外的字符
{^0-9]:匹配任意非数字
[^[:alnum:]]:匹配任意非正常字符
基础特性八
IO重定向以及管道
可用于输入的:文件
键盘设备,文件系统上的常规文件,网卡等
可用于输出的:文件
显示器,文件系统上的常规文件,网卡等
程序的数据流有三种:
输入的数据流:<-- 标准输入(stdin),键盘
输出的数据流:–> 标准输出(stdout),显示器
错误输出流 :–> 标准输出(stderr),显示器
fd:file descriptor ,文件描述符 (相当于windows中的句柄)
对于任何一个程序,因为一切皆文件,所以其标准输入的fd为0,
标准输出fd为1,错误输出fd为:2
IO重定向: 将本来的标准输入输出位置改为其他位置,比如标准输入流为键盘,但是通过重定向改为其他位置
输出重定向:>
test]# cat /etc/issue > /tmp/issue.out 将本应输出到显示器的issue重定向到/tmp/issue.out文件中
特性:覆盖输出,
注意:可以使用命令 ~]# set -C 命令使得覆盖重定向丧失覆盖功能,只对当前shell有效
禁止覆盖后,可以使用强制覆盖输出: >|
恢复覆盖功能 ~]# set +C
输出重定向:>>
test]# cat /etc/issue >> /tmp/issue.out 将本应输出到显示器的issue重定向到/tmp/issue.out文件中
特性:追加输出,保留原有内容保留追加
错误输出重定向:2>(覆盖重定向) ,2>>(非覆盖重定向)
合并正常输出流和错误输出流: &>,&>>
另一种方式:
]# cat /etc/rc.d/init.d/functions >> /tmp/function.out 2>&1
将functions输出至/tmp/function.out 如果发生错误 也输出到 /tmp/function.out
输出重定向的特殊设备:/dev/null 数据黑洞 是一个软设备,任何输出送给它都会被抛弃,不返回执行结果,只返回状态结果,可以根据此状态来判断后续是否要执行其他
~]# ls /varr &> /dev/null
~]# echo $?
2
表示命令执行错误
输入重定向:<
例如:]# cat < /etc/issue 将本来是来自键盘的输入 重定向至文件 /etc/issue
tr:命令,tr [OPTION]... SET1 [SET2]
把输入的数据当中的字符,凡是在SET1定义范围内出现的,一律对应位置转换为SET2中的字符
tr abc ABC 将所有的a转换为A 将所有的b转换为B 将所有的c转换为C
~]# tr [a-z] [A-Z]
how are you
HOW ARE YOU
~]# tr [a-z] [A-Z] < /etc/issue
CENTOS RELEASE 6.5 (FINAL)
KERNEL \R ON AN \M
~]# tr -d '[A-Z]' < /etc/issue 将/etc/issue全部的大写字母删除,但是并不会修改源文件
ent release 6.5 (inal)
ernel \r on an \m
输入重定向:<< 表示此处创建文档
~]# cat << EOF
> how are you?
> what's your name
> EOF
how are you?
what's your name
Here Document:<<
cat << EOF
cat > /PATH/TO/SOMEFILE << EOF
管道:连接程序,将前一个命令的输出直接定向给后一个程序当作输入
COMMOND1 | COMMOND2 | COMMOND3....
~]# cat /etc/issue | tr 'a-z' 'A-Z' 将cat命令的结果送给tr命令 将a-z转换为A-Z
]# who | head -1 | tr 'a-z' 'A-Z' 查看登录的用户| 只查看第一行 | 将小写的‘a-z'转换为大写的'A-Z'
tee命令:将标准输入流分叉,一条流向可以存入一个文件,另一条流向可以发送至标准输出流或者管道
~]# cat /etc/issue | tee /tmp/issue.tee | tr 'a-z' 'A-Z'
CENTOS RELEASE 6.5 (FINAL)
KERNEL \R ON AN \M
~]# cat /tmp/issue.tee
CentOS release 6.5 (Final)
Kernel \r on an \m
该例中,将/etc/issue的输出流通过管道发送给tee,tee命令将输入流分叉,一条输入流输出到/tmp/issue.tee,另一条输出给tr命令