BASH学习笔记

Posted on 2020-04-25 14:34  hrers  阅读(318)  评论(0编辑  收藏  举报

笔记来源于他人教程,请勿转载哦!谢谢!

==========bash学习笔记===========

1.解释性语言特性
读取一行忘掉一行,读取一段(如函数定义)忘掉一段;必须先定义才能调用,不能先调用再定义。

2.bash的交互式与登录式
交互式:echo $-显示的结果中出现字母i则为交互式,或者echo $PS1非空
登陆式:shopt login_shell为ON则为登录式,登录式会读取bash相关配置文件(profile/bash_profile/bashrc/.bashrc/profile.d/*.sh)

3.常见的bash地洞方式
su:交互式非登录式
su --login/su -:交互式登录式
bash命令:交互式非登录式
bash --login:交互式登录式
ssh远程执行命令不登录:非交互非登录
shell脚本:非交互非登录
shell 加--login:非交互登录式
图形终端:默认交互式非登录式,但是可以更改

4.shell各配置文件
profile/bash_profile:全局配置文件,登录式时执行
bashrc/.bashrc/profile.d/*sh:非登录交互式时执行,非交互式时profile.d/*sh文件将结果定义到空,所以没有结果。注意bashrc文件对全局生效,所有用户都会执行。若想单用户生效建议定义在用户配置文件bashrc下

5.写时复制
子进程只有在需要的时候复制父进程的信息

6.exec命令
用于将当前的新进程代替原来的进程,代表着其余6个家族函数。原理是调用系统调用execve来实现功能.

7.sleep 30& 和(sleep 30 &)
sleep 30&在当前bash中启动一个进程,(sleep 30 &)脱离当前终端启动了一个后台进程

8.僵尸进程与孤儿进程
在子进程结束后,父进程没有为子进程的退出状态收尸,导致系统认为子进程还在使用,所以一直挂在后台运行,称为僵尸进程;在父进程死亡后,子进程还存在,此时子进程会挂靠到init/systemd进程pid=1下,等待shell的回收,称为孤儿进程。

9.ps -aux |grep 'ps -au[x]' 可以替代pa -aux|grep 'ps -aux' |grep -v 'grep'
解释:因为加上[]号后,grep进程就变成了ps -au[x]这样,而他的正则匹配解析结果匹配的是ps -aux,所以grep进程不会被匹配到输出。其实就是加上[]号改变grep进程的输出结果,以不被匹配到。

10. PPID PID PGID SID TTY TPGID STAT UID
父进程 子进程 进程组 会话 终端 前台进程组 状态 进程用户

11.ps j查看进程组属性

12.管道存储量测试
dd if=/dev/zero bs=1 |sleep 3& sleep 1 && pkill -INT -x dd
管道最大存储65536个字节

13.关于命令echo "hello" | while read line ;do i=$line;done,输出变量$i没有内容的解释
由于管道的原因,echo命令若先处理,echo命令会成为leader进程,而while的处理需要内置的bash进程来解析,所以运行的进程为bash进程,而bash进程是fork出来的子shell环境,当while解析完成后,子shell就推出了,相应的变量$i也就消失了。而echo "$i"是在当前shell环境执行的,所以没有结果。

14.关于命令while read line ;do i=$line ;done <<<"hello" 和命令while read line ;do i=&line;done<<("echo hello")输出的变量$i有值,是因为while的解析是通过当前shell环境解析的,所以最后echo "$i"有结果。

15.管道两边的命令其中之一会成为leader进程,而另一个会成为其子进程。

16.io buffer缓冲模式分为三种:行缓冲、块缓冲、无缓冲;输出到终端为行缓冲;stdbuf、unbuffer可以调整缓冲模式;grep参数--line-buffered可以改变grep块缓冲为行缓冲,但是会有损性能。行缓冲会设计到多次系统调用,块缓冲可以减少系统调用。

17.命名管道
创建命名管道:mkfifo /tmp/a.fifo
echo "xxx">/tmp/a.fifo #写入数据到命名管道
cat /tmp/a.fifo #读取命名管道数据

18.通过命名管道共享终端会话
mkfifo /tmp/share.fifo
script -f /tmp/share.fifo #分享脚本执行结果
cat /tmp/share.fifo
exit #退出当前共享

19.通过命名管道实现临时文件(避免创建临时文件的io消耗情况)
mkfifo /tmp/data.sql.fifo
gzip -d <data.gz> /tmp/data.sql.fifo $ #将sql语句临时文件写入命名管道
mysql -uxxx -pxxx -e "load data infile '/tmp/data.sql.fifo' into table tb_name" #mysql命令读取命名管道

20.双命名管道
mkfifo /tmp/in.fifo /tmp/out.fifo
grep 'a' </tmp/in.fifo >/tmp/out.fifo
echo "abcd" >/tmp/in.fifo
cat /tmp/out.fifo

21.命令管道通过配合tee命令,实现多命令操作同一份数据
tee命令将数据分别保存在三个创建的管道
三个管道的数据分别输出给不同的命令来处理

22.nc命令可以打开本地的一个套接字,用来监听连接请求
nc -l 12345 |nc www.baidu.com 80
命名管道结合nc工具实现代理服务
mkfifo backpipe
nc -l 12345 <backpipe |nc www.baidu.com 80>backpipe
注:backpipe管道将数据交给nc命令监听的12345端口,然后通过匿名管道传给百度的80端口,最后将返回结果写入命名管道。相当于将命名管道传入的数据通过nc工具代理给百度,再返回给命名管道。

23.放入后台执行的while结构会使用一个新的bash程序来解析

24.killbash可以杀掉非交互bash

25.当使用``时,存在多``包含关系,建议用$()替代,避免出现问题

26.shell中大括号与小括号的说明
当使用小括号包含命令时,如果小括号内只有一个命令,则fork出来的子shell会直接被命令exec替换掉,如果包含多个命令,则会在子shell下面再fork子shell来处理多个命令。
当使用大括号包含命令时,大括号内的命令会直接在当前shell环境fork子shell来执行命令。

27.在shell解析命令行的时候,会首先解析重定向操作,处理完重定向之后才会来处理命令。所以,可能导致sed替换文件内容后重定向到文件,结果内容为空。由于先解析重定向,重定向将文件清空了,所以sed读取文件时为空,所以输出为空。

28.read命令
read -p "xxx" n #-p表示添加提示内容
read -d #-d表示输入变量分隔符
read -n #表示按字符读取变量

39.文件描述符的备份和还原
exec 6>&1
exec 1>/tmp/file.txt
echo "------------"
exec 1>&6 6>&-
echo "++++++++++++"

40.shell的命令行解析:当输入一个命令行时,首先shell会进行解析,包括各种引号、重定向、管道等。解析完成后,剩下的内容才会交由命令去解析.
没有引号,shell会全部解析
有单引号,shell会全部不解析
有双引号,shell会解析特殊字符

41.shell环境通配扩展
shopt -s dotglob #隐藏文件搜索的通配扩展
shopt -s globstar #下级目录搜索的通配扩展
shopt -s extglob #开启shell环境的正则通配选项
如:执行完shopt -s dotglob之后,ls 命令通过*匹配,就可以匹配到隐藏文件
执行完shopt -s globstar之后,就可以递归查询到多级目录

42.eval命令可以对命令行进行二次解析

43. kill 0 可以清理掉当前shell进程

44.快捷键类型信号发送的信号对于后台进程没有用,无法结束当前shell

45.进程替换是开启了一个虚拟文件用于数据交换。cat <<(echo "xxx"),因为是虚拟文件,所以需要cat来查看

46.%+后台程序id,可以引用该id后台进程,%1、%2....。fg命令加序号可以将后台进程调用为前台进程,bg命令可以将一个前台进程调度到后台运行。

47.进程组的id(pgid)等于leader进程的pid

48.timeout 5 bash -c 'while xxx' #可以设置while语句的执行时间

49.source命令加载一个定义的函数脚本,就可以在另一个脚本中引用定义的函数

50.flock命令 #用于实现文件锁功能
flock -x /tmp/a.lock 命令 参数 #以临时文件a.lock作为文件锁,申请排他锁
flock -s /tmp/a.lock 命令 参数 #以临时文件a.lock作为文件锁,申请共享锁
flock -n -x ... #-n表示非阻塞形式,申请失败直接返回
flock -w 5 -x ... #-w选项表示设置申请锁的超时时间,超过5秒就返回
flock -w 5 -E 9 -x ... #-E表示指定申请失败后的退出状态码为9
lslocks #查看当前已经申请的锁
-c选项在后面执行命令不带参数时使用
flock是作用在内核层open_file表层次的

51.getopt用于设计命令选项
-o:指定命令短选项
-l:指定命令长选项
-n:指定报错后的显示命令名称
ls -l --version : -l表示短选项 --version表示长选项
选项型参数:表示命令选项后接的参数
非选型型参数:表示非命令选项后接的参数
如:find / -type f -name "xxx" #/表示非选项型参数,f "xxx"表示选项型参数
-o -l指定的选项后面加上:表示该选项必须要加参数
-- #表示指定选项结束,后面为参数

52.set -- 变量 #可以解析变量中的值设置为位置参数

53.tee命令:将管道的输入数据保存到多个文件或输出到多个设备,结合进程替换,可以多进程处理同一份数据,但是输出顺序无法保证,可以写入文件统一输出,或者输出给cat命令查看。
pee命令:将管道的输入数据交个多个命令执行,执行完成后再统一输出。
ts命令:可以为命令的输出结果加上时间戳