zoukankan      html  css  js  c++  java
  • 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命令:可以为命令的输出结果加上时间戳

  • 相关阅读:
    Best Time to Buy and Sell Stock III
    Valid Palindrome
    Longest Substring Without Repeating Characters
    Copy List with Random Pointer
    Add Two Numbers
    Recover Binary Search Tree
    Anagrams
    ZigZag Conversion
    Merge k Sorted Lists
    Distinct Subsequences
  • 原文地址:https://www.cnblogs.com/hrers/p/12772978.html
Copyright © 2011-2022 走看看