Shell 的分类
- Linux中默认的Shell是/bin/bash,流行的Shell有
ash
、bash
、ksh
、csh
、zsh
等,不同的Shell都有自己的特点以及用途。bash
大多数Linux系统默认使用的Shell,bash Shell 是 Bourne Shell 的一个免费版本,它是最早的Unix Shell
bash还有一个特点,可以通过help命令来查看帮助。
包含的功能几乎可以涵盖Shell所具有的功能,所以一般的Shell脚本都会指定它为执行路径。
csh
csh是具有C语言风格的一种Shell,其内部命令有52个,较为庞大。
目前使用的并不多,已经被/bin/tcsh所取代。
ksh
Korn Shell
的语法与 Bourne Shell 相同,同时具备了 C Shell 的易用特点。
许多安装脚本都使用ksh
ksh 有42条内部命令,与bash相比有一定的限制性。
tcsh
tcsh
是csh
的增强版,与 csh
完全兼容。
sh
是一个
快捷方式
,已经被/bin/bash
所取代。
nologin
指用户不能登录
zsh
目前Linux里最庞大的一种 zsh。
它有84个内部命令,使用起来也比较复杂。
一般情况下,不会使用该Shell。
Shell 能做什么
- 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略…)
- 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
- 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
- 日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk)
- 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
- 自动化管理程序(批量远程修改密码,软件升级,配置更新)
- 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
- 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
- 自动化扩容(增加云主机——>业务上线)
- Zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)
- 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
- Shell可以做任何事(一切取决于业务需求)
bash 环境变量文件
/etc/profile
全局(公有)配置,不管是哪个用户,登录时都会读取该文件。
/etc/bashrc
Ubuntu 没有此文件,与之对应的是 /ect/bash.bashrc
它也是全局(公有)的
bash 执行时,不管是何种方式,都会读取此文件。
~/.profile
若 bash 是以 login 方式执行时,读取 ~/.bash_profile,
若它不存在,则读取 ~/.bash_login,
若前两者不存在,读取~/.profile。
图形模式登录时,此文件将被读取,即使存在 ~/.bash_profile 和 ~/.bash_login。
~/.bash_login
若 bash 是以 login 方式执行时,读取 ~/.bash_profile,
若它不存在,则读取 ~/.bash_login,
若前两者不存在,读取 ~/.profile。
~/.bash_profile
Unbutu 默认没有此文件,可新建。
只有 bash 是以 login 形式执行时,才会读取此文件。
通常该配置文件还会配置成去读取 ~/.bashrc。
~/.bashrc
当 bash 是以 non-login 形式执行时,读取此文件。
若是以 login 形式执行,则不会读取此文件。
.bashrc 文件内写一行
source /etc/profile
每执行一次shell,都会执行一次bashrc,然后就会执行source,避免环境变量报错
~/.bash_logout
注销时,且是 longin 形式,此文件才会读取。
在文本模式注销时,此文件会被读取,
图形模式注销时,此文件不会被读取。
bash 环境变量加载
- 图形模式登录时,顺序读取:
/etc/profile
和~/.profile
- 图形模式登录后,打开终端时,顺序读取:
/etc/bash.bashrc
和~/.bashrc
- 文本模式登录时,顺序读取:
/etc/bash.bashrc
,/etc/profile
和~/.bash_profile
- 从其它用户 su 到该用户,则分两种情况:
- 如果
带 -l 参数(或-参数,--login 参数)
,如:su -l username,则 bash 是login
的,它将顺序读取以下配置文件:/etc/bash.bashrc
,/etc/profile
和~/.bash_profile
。 - 如果
没有带 -l 参数
,则 bash 是non-login
的,它将顺序读取:/etc/bash.bashrc
和~/.bashrc
- 注销时,或退出 su 登录的用户,如果是
longin
方式,那么 bash 会读取:~/.bash_logout
- 执行自定义的 Shell 文件时,若使用
bash -l a.sh
的方式,则 bash 会读取行:/etc/profile
和~/.bash_profile
, - 若使用其它方式,如:
bash a.sh
,./a.sh
,sh a.sh
(这个不属于bash Shell),则不会读取上面的任何文件
。
- 上面的例子,凡是读取到
~/.bash_profile
的,若该文件不存在
,则读取 ~/.bash_login
,若前两者不存在
,读取 ~/.profile
。
login shell与non-login shell
login shell
取得 bash 时需要完整的登陆流程的,就称为 login shell
。
举例来说,我们登陆终端时,需要输入用户的账号与密码,此时取得的 bash 就称为
login shell
non-login shell
取得 bash 时不需要完整的登陆流程的 ,就称为 non-login shell
。
在原本的 bash 环境下再次使用 bash 这个命令,建立了一个bash子进程,没有输入账号密码, 那第二个 bash (子程序) 也是 non-login shell
bash 特性
命令和文件自动补齐
很多命令都会提供一个 bash-complete 的脚本,在执行该命令时,敲 tab 可以自动补全参数,会极大提高生产效率。
linux命令自动补全需要安装 bash-completion (yum install -y bash-completion
)
注意: 断开终端,重新连接后可正常 tab 补齐
默认情况下,Bash 为 Linux 用户提供了下列标准补全功能。
- 变量补全
- 用户名补全
- 主机名补全
- 路径补全
- 文件名补全
命令历史记忆功能
Bash 有自动记录命令的功能,自动记录到.bash_history隐藏文件中。还可以在下次需要是直接调用历史记录中的命令
centos 可以通过/etc/profile中的文件来定义一些参数、
在bash中,使用history 命令来查看和操作之前的命令,以此来提高工作效率。
history是bash的内部命令,所以可以使用 help history 命令调出 history 命令的帮助文档(history默认保存1000行)。
关于history的一些用法,可以看我的另一篇博客:有个姑娘叫history
别名功能
alias
命令
别名的好处是可以把本来很长的指令简化缩写,来提高工作效率。
alias
# 查看系统当前所有的别名
alias h5='head -5'
# 定义新的别名。这时候输入h5就等于输入’head-5‘
unalias h5
# 取消别名定义如果想要文件永久生效,只需将上述别名命令写到对应用户或者系统 bashrc 文件中
如果想用真实命令可以在命令前面添加反斜杠 ,使别名失效
关于alias的一些用法,可以看我另一篇博客:linux可以这样玩 之 杂乱无章的随笔(不定期更新){搜索:利用alias传参,自定义linux命令}
快捷键
快捷键不区分大小写,大写是为了方便区分
快捷键 | 作用 |
ctrl+A | 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。 |
ctrl+E | 把光标移动到命令行结尾。 |
ctrl+C | 强制终止当前的命令。 |
ctrl+L | 清屏,相当于clear命令。 |
ctrl+U | 删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便 |
ctrl+K | 删除或剪切光标之后的内容。 |
ctrl+W | 删除或剪切光标之前的内容(注意:和浏览器的快捷键会有冲突,浏览器的快快捷键是关闭当前标签页)。 |
ctrl+Y | 粘贴ctrl+U或ctul+K剪切的内容。 |
ctrl+R | 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。 |
ctrl+D | 退出当前终端。 |
ctrl+Z | 暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们在系统管理章节详细介绍。 |
ctrl+S | 暂停屏幕输出。 |
ctrl+Q | 恢复屏幕输出。 |
前后台作业控制
Linux bash Shell单一终端界面下,经常需要管理或同时完成多个作业,如一边执行编译,一边实现数据备份,以及执行SQL查询等其他的任务。所有的上述的这些工作可以在一个 bash 内实现,在同一个终端窗口完成。
前后台作业的定义
- 前后台作业实际上对应的也就是前后台进程,因此也就有对应的 pid。在这里统称为作业。
- 无论是前台作业还是后台作业,两者都来自当前的Shell,是当前Shell的子程序。
- 前台作业:可以由用户参与交互及控制的作业我们称之为前台作业。
- 后台作业:在内存可以自运行的作业,用户无法参与交互以及使用[ctrl]+c来终止,只能通过bg或fg来调用该作业。
几个常用的作业命令
command &
直接让作业进入后台运行[ctrl]+z
将当前作业切换到后台jobs
查看后台作业状态fg %n
让后台运行的作业n切换到前台来bg %n
让指定的作业n在后台运行kill %n
移除指定的作业n"n"
为jobs命令查看到的job编号
,不是进程id。- 每一个job会有一个对应的job编号,编号在当前的终端从1开始分配。
- job 编号的使用样式为[n],后面可能会跟有 “+” 号或者 “-” 号,或者什么也不跟。
- “+” 号表示最近的一个job,
- “-” 号表示倒数第二个被执行的Job。
- 注,“+” 号与 “-” 号会随着作业的完成或添加而动态发生变化。
- 通过jobs方式来管理作业,当前终端的作业在其他终端不可见。