Linux重要知识点汇总——认识和学习bash
硬件、内核与shell
我们必须要通过“shell”将我们输入的命令与内核通信,好让内核可以控制硬件来正确无误地工作。
www.zhishiwu.com
操作系统其实是一组软件,由于这组软件在控制整个硬件与管理系统的活动监测,如果这组软件随意被用户操作,若用户应用不当,将会使整个系统崩溃。
只要能够操作应用程序的接口都能够称为shell。狭义的shell指的是命令行方面的软件。广义的shell则包括图形界面的软件。
shell的好处:
命令行界面的shell,大家都一样
远程管理:命令行界面就是比较快
管理系统的关键
系统的合法shell与/etc/shells功能
目前的Linux可以使用的shell(/etc/shells文件):
/bin/bash(Bourne Again SHell,Linux默认的shell)
/bin/ksh(Kornshell由AT&T Bell lab发展出来,兼容于bash)
/bin/tcsh(整合C shell,提供更多的功能)
/bin/zsh(基于ksh发展出来,功能更强大)
用户何时取得shell工作以及用户默认的shell记录在/etc/passwd文件内
www.zhishiwu.com
bash shell的功能
命令记忆能力(history)
命令与文件补全功能(【Tab】按键的好处)
命令别名设置功能(alias)
作业控制、前台、后台控制(job control, foreground, background)
程序脚本(shell script)
通配符(Wildcard)
bash shell的内置命令:type
了解命令是来自于外部命令(指的是其他非bash所提供的命令)或是内置在bash当中
type [-tpa] name
参数:
type:不加任何参数时,type会显示出name是外部命令还是bash内置命令
-t:type将name以下面这些字眼显示出它的意义:
file:表示位外部命令
alias:表示该命令为命令别名所设置的名称
builtin:表示内置命令
-p:如果后面接的name为外部命令时,才会显示完整文件名
-a:会有PATH变量定义的路径中,将所有含name的命令都列出来,包含alias
命令的执行
反斜杠(/)转移字符
shell的变量功能
变量的可变性与方便性
影响bash环境操作的变量:PATH变量
在进入shell之前,由于系统需要一些变量来提供他数据的访问(或者是一些环境的设置参数值,例如是否要显示彩色等的),所以就有一些所谓的“环境变量”需要来读入系统。为了区别与自定义变量的不同,环境变量通常以大写字符来表示
脚本程序设计(shell script)的好帮手
变量的显示与设置:echo,unset
变量的显示echo
只需要在变量名称前面加上$,或者是以${变量}的方式来显示都可以。
设置或者修改变量的内容:用“等号(=)”连接变量与它的内容
在bash中,当一个变量名称尚未被设置时,默认的内容是“空”的。
变量的设置规则:
变量与变量以一个等号“=”来连接
等号两边不能直接接空格符
变量名称只能是英文字母与数字但是开头字符不能是数字
变量内容若有空格符可使用双引号或单引号将变量内容结合起来,但是双引号类的特殊字符如$等,可以保留原本特性;单引号类的特殊字符则仅为一般字符(纯文本)
可用转义字符“/”将特殊符号变成一般字符
在遗传命令中,还需要通过其他的命令提供的信息,可以使用反单引号“`命令`”或“$(命令)”。
若该变量为了增加变量内容时,则可使用“$变量名称”或${变量}累加内容
若该变量需要在其他子进程中执行,则需要以export来使变量变成环境变量
通常大写字符为系统默认变量,自行设置变量可以使用小写字符方便判断
取消变量的方法为使用“unset 变量名称”
子进程:在目前这儿shell的情况下,其打开另一个新的shell,新的shell就是子进程。在一般状态下,父进程的自定义变量是无法在子进程内是使用的。但通过export将变量编程环境变量以后,就能够在子进程下面使用了。
环境变量的功能
用env(environment)查看环境变量与常见环境变量说明
HOSTNAME:这台主机的主机名
TERM=这个终端机使用的环境是什么类型
SHELL=目前这个环境下使用的shell是哪一个程序
HISTSIZE=记录命令的条数,在CentOS中默认可记录1000笔
USER=用户的名称
LS_COLORS=一些颜色显示
MAIL=和这个用户取用的mailbox位置
PATH:执行文件命令查找路径
INOUTERC=与键盘功能有关,可以设置特殊按键
PWD=目前用户所在的工作目录
LANG=这个与语系相关
HOME=这个用户的主文件夹
_=上一次使用的命令的最后一个参数(或命令本身)
RANDOM:“随机数”变量,内容介于0~32767之间
用set查看所有变量(含环境变量与自定义变量)
HISTFILE=历史命令记录的放置文件,隐藏文件
MAILCHECK=每60秒去扫描一次信箱有无新信
PS1=命令提示符的设置值
PS2=使用转义符号第二行以后的提示符
$目前这个shell所使用的PID
?刚才执行完命令的回传码
一般来说,不论是否为环境变量,只要跟目前这个shell的接口操作有关的变量,通常都会被设置为大写字符,也就是说,基本上,在Linux默认的情况中,使用{大写字符}来设置的变量一般为系统内定需要的变量。
PS1(提示符的设置)
$(关于本shell的PID)
?(关于上个执行命令的回传码)
一般来说,如果成功执行命令,则会回传一个0值,如果执行过程中发生错误,就会回传“错误代码”,一般就是以非0的数值来替代
export:自定义变量转成环境变量
环境变量与自定义变量的差异:该变量是否会被子进程所继续使用
子进程仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量
影响显示结果的语系变量(locale)
locale
变量的有效范围
环境变量可以被子进程所引用,但是其他的自定义变量内容就不会存在于子进程中
当启动一个shell,操作系统会分配一个记忆块给shell使用,此内存类的变量可让子进程取用
若在父进程利用一个export功能,可以让自定义变量的内容写到上述记忆块当中(环境变量)
当加载另一个shell时,子shell可以将父shell的环境变量所在的记忆块导入到自己的环境变量块当中
变量键盘的读取、数组与声明:read,array,declare
read:读取来自键盘输入的变量
参数:
-p:接提示信息
-t:接等待的“秒数”
declare/typeset:声明变量类型
参数:
-a:数组类型
-i:整型
-x:环境变量
-r:readonly类型,该变量不可被更改内容,也不能重设
在默认的情况下,bash对于变量有几个基本的定义:
变量类型默认为“字符串”
bash环境中的数值运算,默认最多仅能达到整数类型
与文件系统及程序的限制关系:ulimit
ulimit [-SHacdfltu] [配额]
参数:
-H:hard limit,严格的设置,必定不能超过这个设置的数值
-S:soft limit,警告的设置,可以超过这个数值,但是若超过则有警告信息
-a:列出所有的限制额度
-c:当某些进程发生错误时,系统会将该进程在内存中的信息写成文件(排错用),这种文件就被称为内核文件(core file),此为限制每个内核文件的最大容量
-f:此shell可以创建的最大文件容量(一般为2GB)单位为KB
-d:进程可使用的最大断裂内存(segment)容量
-l:用于锁定(lock)的内存量
-t:可使用的最大CPU时间
-u:单一用户可以使用的最大进程(process)数量
变量内容的删除、替代与替换
命令别名设置:alias,unalias
历史命令:history 【n】
history 【-c】
history 【-raw】 histfiles
参数:
n:数字,是要列出最近的n条命令行
-c:将目前的shell所有的history内容全部消除
-a:将目前新增的history命令新增入histfiles中,若没有加histfiles,则默认写入~/.bash_history
-r:将histfiles的内容读到目前这个shell的history记忆中
-w:将目前的history记忆内容写入histfiles中(默认为~/.bash_history)
历史命令在注销时,会将最近的HISTSIZE条记录到记录文件当中
!number:执行第几条命令
!command:有最近的命令向前搜寻命令串开头为command的那个命令,并执行
!!:执行上一个命令
Bash Shell的操作环境
路径与命令查找的顺序:
以相对/绝对路径执行命令
由alias找到该命令执行
由bash内置的(builtin)命令来执行
通过$PATH这个变量的顺序找到的第一个命令来执行
bash的登陆与欢迎信息:/etc/issue,/etc/motd
bash的环境配置文件
login与no-login shell
login shell:取得bash时需要完整的登陆流程,读取/etc/profile(系统整体设置),~/.bash_profile或~/.bash_login或~/.profile(属于用户个人设置)
no-login shell:取得bash接口的方法不需要重复登录的举动,读取~/.bashrc
source读入环境配置文件
其他相关配置文件
/etc/man.config:规定了使用man的时候man page的路径到那里去寻找
~/.bash_history:历史命令记录
~/.bash_logout:记录注销bash后系统完成的操作
终端机环境设置:stty,set
通配符与特殊符号
数据流重定向
执行一个命令的时候,这个命令可能会由文件读入数据,再将数据输出到屏幕上。
standard output:标准输出,命令执行所回传的正确信息
standard error output:标准错误输出,命令执行失败后,所回传的错误信息
数据流重定向可以将standard output(简称stdout)与standard error output(简称stderr)分别传送到其他的文件或设备去,分别传送所用的特殊字符如下:
标准输入(stdin):代码为0,使用<或<<;
标准输出(stdout):代码为1,使用>或>>;
标准错误输出(stderr):代码为2,使用2>或2>>;
1>:以覆盖的方法将正确的数据输出到指定的文件或设备上
1>>:以累加的方法将正确的数据输出到制定的文件或设备上
/dev/null垃圾桶黑洞设备与特殊写法
如果知道错误将要发生,将错误信息忽略掉而不显示或存储
将错误和正确的数据通通写入一个文件:2>&1也可以是&>
standard input:<与<<
将原本需要由键盘输入的数据改由文件内容替代
<<代表结束输入的意思
使用命令输出重定向的原因:
屏幕输出的信息很重要,而且需要将它存下来
后台执行中的程序,并不希望它干扰屏幕正常的输出结果
一些系统的例行命令的执行结果,希望它可以存下来时
一些执行命令的可能已知错误信息时,想以“2>/dev/null”将它丢掉时
错误信息与正确信息需要分别输出时
命令执行的判断依据:
cmd;cmd(不考虑命令相关性的连续命令执行)
$? (命令回传码)与&&或||
cmd1 && cmd2:若cmd1执行完毕且正确执行($?=0),则开始执行cmd2
cmd1 || cmd2:若cmd1执行完毕且正确执行($?=0),则cmd2不执行
一般来书,假设判断式有三个:cmd1 && cmd2 || cmd3,cmd2和cmd3会放置肯定可以执行成功的命令
管道命令(pipe)
管道命令“|”仅能处理经由前面一个命令传来的正确信息,也就是standard output的信息,对于standard error output并没有直接的处理能力。
在每个管道后面接的第一个数据必定是“命令”,而且这个命令必须要能接受standard input的数据才行
选取命令:
cut:将一段信息的某一段“切”出来,处理的信息是以“行”为单位
cut –d ‘分隔字符’ –f fields(取出第几段)
cut –c 字符范围(以字符的单位去除固定字符区间)
grep:分析一行信息,若当中有需要的信息,就将该行拿出来
grep [-acinv] [—color=auto] ‘查找字符串’filename
参数:
-a:将binary文件以text文件的方式查找数据
-c:计算找到‘查找字符串’的次数
-i:忽略大小写
-n:输出行号
-v:反向选择,即显示没有‘查找字符串’内容的哪一行
--color=auto:将找到的关键字部分加上颜色显示
排序命令:
sort:排序命令,依据不同的数据类型排序
uniq:将重复的数据仅列出一个显示
wc:文件里面的字数,行数和字符数
双重定向:tee
同时将数据流送与文件与屏幕(screen);而输出到标准屏幕的,其实就是stdout,可以让下个命令继续处理
tee –a file:以累加的方式,将数据加入file中
字符转换命令:
tr:删除一段信息当中的文字,或者是进行文字信息的转换
tr [-ds] set1
参数;
-d:删除信息当中的set1这个字符串
-s:替换掉重复的字符
col [-xb]
参数:
-x:将tab键换成对等的空格键
-b:在文字内有反斜杠(/)
col经常被利用于将man page转存为纯文本文件以方便查阅的功能
join,将两个文件当中有相同数据的那一行加在一起
join [-ti12] file1 file2
参数:
-t:join默认以空格符分隔数据,并且对比“第一个字段”的数据
-i:忽略大小写
-1:代表第一个文件要用哪个字段来分析
-2:代表第二个文件要用哪个字段来分析