Bash
Linux系统终端概述
图形化
服务器终端切换:Ctrl + Alt + F1 _ F6
虚拟机终端切换:Ctrl + Shift +Alt + F1 _ F6
字符终端
服务器终端切换:Alt + F1 _ F6
pkill -9 -t tty2
-t:终端名称
-9:强制
2.Linux系统和Bash管理
Linux提供的用户界面
字符界面
shell
bash(默认)
[root@oldboy ~]# echo $SHELL #查看当前系统使用的shell版本(默认是bash)
/bin/bash
[root@oldboy ~]# cat /etc/shells #查看Linux当前系统支持的shell版本有哪些
sh -->bash的软(符号)链接
bash
nologin
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
图形化界面
gnome
kde
date
查看时间
一般使用+格式的方式来显示我们所需要的时间格式
[root@oldboy ~]# date +%F_%R
2019-10-15_14:37
[root@oldboy ~]# date +%F-%R
2019-10-15-14:38
[root@oldboy ~]# date +"%F %R"
2019-10-15 14:39
touch log_`date +%F_%R`.bak
touch log_$(date +%F_%R).bak
whoami 查看当前位置
Bash特性:命令补全
通过上下方向键来调取过往执行过的Linux命令;
命令或参数仅需输入前几位的可以用Tab键补全
Bash特性:命令快捷键
终端快捷键的使用可以帮助我们大大提升效率
Ctrl + a #光标跳转至正在输入的命令行的首部 home
Ctrl + e #光标跳转至正在输入的命令行的尾部 end
Ctrl + c #终止前台运行的程序
Ctrl + d #在shell中,ctrl-d表示推出当前shell。
Ctrl + z #将任务暂停,挂至后台
Ctrl + l #清屏,和clear命令等效。
Ctrl + k #删除从光标到行末的所有字符
Ctrl + u #删除从光标到行首的所有字符
Ctrl + r #搜索历史命令, 利用关键字
//在命令行前加“#”,则该命令不会被执行
History查看系统命令历史,追溯之前发生情况
[root@oldboy ~]# echo $HISTSIZE
1000
[root@oldboy ~]# HISTSIZE=200
[root@oldboy ~]# echo $HISTSIZE
200
命令选项:
-w 保存命令历史到历史文件
-c 清空命令历史记录,不会情况文件
-d 删除命令历史的第N条行
!可以调用之前的命令
!num
调用第num行的命令历史
!!
执行上一条命令
!cmd
调用离当前最近以该cmd开头的命令
!$/按住ESC,松开按.
执行上条命令的参数
命令别名
alias
alias cmd='cmd '
unalias cmd
注意:
1.使用alias命令就可以查看当前生效的别名有哪些
2.使用unalias 接别名名称 取消
3.alias只对当前环境临时生效
4.如需永久生效,需将定义别名的命令写入登录配置问价
~/.bash_profile 只对当前用户生效,局部配置文件
~/.bashrc 只对当前用户生效,局部配置文件
/etc/profile 对所有用户生效,全局配置文件
/etc/bashrc 对所有用户生效,全局配置文件
[root@oldboy ~]# alias ifconfig='ifconfig ens33'
命令流程 图1
当我们执行一个命令,整个命令执行流程如下 :
1.判断命令是否通过绝对路径执行
2.判断命令是否存在别名
3.判断用户输入的是内部命令还是外部命令
内部命令:shell程序自带的命令
外部命令:在系统PATH变量的某个路径下的可执行程序
使用type命令检测用户输入的命令属于内部命令还是外部命令
4.内部命令直接执行,外部命令检测是否存在缓存
5.检测PATH路径,有执行,无报错
图1 bash命令流程
//表缓存命令所在位置
[root@oldboy ~]# hash
命中 命令
3 /usr/bin/locate
1 /usr/bin/ls
1 /usr/bin/find
//已缓存命令,如果移动位置会导致无法找到该命令
[root@oldboy ~]# mv /usr/bin/find /tmp/
[root@oldboy ~]# find
-bash: /usr/bin/find: 没有那个文件或目录
//删除缓存过的find命令,即可执行
[root@oldboy ~]# hash -d find
[root@oldboy ~]# find
//当然可以清空缓存表
[root@oldboy ~]# hash -r
//命令缓存hash需要注意如下情况
1.如果执行外部命令1次就会对该命令进行缓存
2.如果将命令移动了位置
a.使用绝对路径执行
b.删除hash表的缓存指令
总结,当我们执行了一个Ping命令之后,整个命令执行的流程步骤如下:
1.检查执行的是否是绝对路劲
2.检查该ping命令是否存在别名
3.检查该ping命令是内部命令还是外部命令
4.如果是内部命令直接执行,如果是外部命令
5.检测该命令是否有缓存,如果没有,查找PATH变量
6.检查PATH路径知道查到该命令然后执行
7.如果没有找到该命令则返回错误。command not found
路径展开
思考:在/tmp路径下创建以下目录
etc/init.date
etc/sysconfig
usr/lib
usr/bin
usr/include
var/spool
var/run
proc
sys
bin
mkdir -pv /tmp/{etc/{init.d,sysconfig},usr/{bin,lib,include},var/{spool,run},proc,sys,bin}
[root@oldboy ~]# tree /tmp/
/tmp/
├── bin
├── etc
│ ├── init.d
│ └── sysconfig
├── proc
├── sys
├── usr
│ ├── bin
│ ├── include
│ └── lib
└── var
├── run
└── spool
转义符
反斜杠():使反斜杠后面的一个变量变为字符串
单引号(''):转义其中所有的变量为单纯字符串
双引号(""):保留其中的变量属性,不进行转义处理
反引号(``): 把其中的命令执行返回结果
//将特殊字符转换为正常字符
[root@oldboy ~]# echo "shop is $500"
shop is 00
[root@oldboy ~]# echo "shop is $500"
shop is $500
//转义其中特殊字符为普通字符串
[root@oldboy ~]# echo 'shop is $500'
shop is $500
//使用$()实现命令替换
[root@oldboy ~]# echo "The dir is $(pwd)"
The dir is /root
//使用``实现命令替换
[root@oldboy ~]# echo "The dir is `pwd`"
The dir is /root
//转义其中所有的变量为单纯的字符串
[root@oldboy ~]# touch file-`date +%F-%H-%S`
[root@oldboy ~]# ls
anaconda-ks.cfg file-2019-10-17-22-54 log_2019-10-15_14:47.bak
[root@oldboy ~]# touch 'file-`date +%F-%H-%S`'
[root@oldboy ~]# ls
file-`date +%F-%H-%S`
[root@oldboy ~]# cat >>.bashrc <<EOF
> echo "server ip is `ifconfig| awk 'NR==2{pring $2}'`"
> EOF