• BASH学习笔记


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

    ==========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命令:可以为命令的输出结果加上时间戳

  • 相关阅读:
    数据类型对照表
    MySql
    操作MongoDB
    Linux常用命令
    MongoDB性能参数
    有关Remoting的几个结论与论证
    异步获取远程文件
    Bigtable:一个分布式的结构化数据存储系统(转)
    windbg命令
    C#下几种排序算法
  • 原文地址:https://www.cnblogs.com/hrers/p/12772978.html
Copyright © 2020-2023  润新知