当前位置 博文首页 > 猫耳山在天边:《Linux命令行与shell脚本编程大全》(第三版)读

    猫耳山在天边:《Linux命令行与shell脚本编程大全》(第三版)读

    作者:[db:作者] 时间:2021-09-15 10:19

    第一部分 Linux命令行

    第三章、基本的bash shell命令

    bash手册

    man 命令

    例子:

    man cat
    空格翻页、回车下一行、左右键看右侧(左侧)内容、q退出
    
    info
    info info
    展示info页面,没看出有什么特别的
    
    hostname

    设置hostname

    hostname mycomputer
    

    浏览文件系统

    遍历目录

    cd

    切换目录

    cd /home/a  切换到/home/a目录,绝对路径
    cd b    切换到当前目录下的b目录
    cd .. 切换到上级目录
    cd ../../ 切换到上级目录的上级目录
    cd ~ 切换到用户家目录
    cd 切换到用户家目录
    cd - 切换到上次切换的目录
    
    pwd

    打印当前目录

    文件和目录列表

    ls

    列出当前目录下的文件和目录

    ls 输出当前目录下文件和目录
    ls -F 同上,目录名后会有/方便区分
    ls -a 同ls,同时展示隐藏文件
    ls -R 递归显示子目录
    ls -l 显示长列表,会有更多文件相关的信息
    ls myscript 展示名字为myscript的文件或目录
    ls myscri?t 过滤展示内容,问号代表一个任意字符
    ls mysc* 过滤展示内容,星号代表多个任意字符
    ls -l --time=atime 展示文件,时间列展示内容改为访问时间(默认是修改时间)
    

    处理文件

    创建文件

    touch
    touch a.log 创建a.log文件,如果该文件存在,更新该文件的修改时间
    touch -a a.log 更新该文件的访问时间而非修改时间
    

    复制文件

    cp
    cp test_1 test_2 把当前目录下的test_1复制到test_2
    cp -i test_1 test_2 复制时如果有文件已经存在,会询问是否覆盖
    cp ../test_3 . 复制上级目录的test_3到当前目录
    cp ../test_3/*.log . 把上级目录中的test_3目录下的所有以.log结尾的文件复制到当前目录
    cp -R test_1 test_2 拷贝时递归拷贝子文件夹
    

    自动补全

    在输入命令、目录名、文件名时制表符可以自动补全

    链接文件

    ln

    创建链接

    ln -s test.log s1_test.log 创建test.log的软链接(符号链接)s1_test.log
    ln test.log h1_test.log 创建test.log的硬链接h1_test.log
    
    readlink -f /usr/bin/python 如果/usr/bin/python是个链接文件,读取他的原始文件
    

    重命名文件

    mv

    移动文件或重命名文件

    mv a.log b.log 重命名a.log文件,改为b.log
    mv ../a.log . 将上级目录中的a.log移动到当前目录
    

    删除文件

    rm

    删除文件或目录

    rm a.log 删除a.log
    rm -i a.log 删除a.log,删除前询问是否删除
    rm -f a.log 强制删除a.log,不询问
    rm -r somedir 递归删除somedir中的内容
    

    处理目录

    创建目录

    mkdir

    创建目录

    mkdir adir 创建adir目录
    mkdir -p adir/bdir/cdir 递归创建目录(不存在的父级目录会自动创建)
    

    删除目录

    rmdir

    删除目录,只有目录为空时才会删除,所以要先删除目录中的内容再删除目录

    rmdir adir 删除adir目录
    

    查看目录树

    tree

    打印目录树,默认可能没有安装

    tree . 打印当前目录的树状结构
    

    查看文件内容

    查看文件类型

    file

    查看文件类型(文本、目录、链接、可执行文件等)

    file a.log 查看a.log的文件类型
    

    查看整个文件

    cat

    查看整个文件

    cat a.log 查看a.log文件的内容
    cat -n a.log 查看a.log文件内容,带行号
    cat -b a.log 查看a.log文件内容,非空行带行号
    cat -T a.log 查看a.log文件内容,不显示制表符(用^I代替)
    
    more

    逐页查看文件内容

    more a.log 逐页查看a.log的文件内容,翻页方法和man相同
    
    less

    逐页查看文件内容,可以倒退

    less a.log 逐页查看a.log的文件内容,翻页方法和more相同,但是在原有基础上增加了上下翻页的功能键(PgUp和PgDn)
    

    查看部分文件

    tail

    查看文件末尾(默认10行)的内容

    tail a.log 查看a.log末尾的内容
    tail -n 20 a.log 查看a.log末尾20行的内容
    tail -f a.log 动态查看a.log末尾的内容(即如果其他程序写入了a.log,这里会实时显示出来)
    

    查看文件开始(默认10行)的内容

    head a.log 查看a.log文件开头的内容
    head -n 20 a.log 查看a.log文件开头20行的内容
    

    第四章、更多的bash shell命令

    监测程序

    探查进程

    ps

    ps的基本输出显示了程序的进程id(PID)、运行在哪个终端(TTY)、以及进程已用的CPU时间

    完成输出格式中,UID:启动进程的用户,PID:进程ID,PPID:父进程ID,C:进程生命周期中的CPU利用率,STIME:进程启动时的系统时间,TTY:进程启动时的终端设备,TIME:累积CPU时间,CMD:启动的程序名称

    ps 显示运行在当前控制台下的属于当前用户的进程
    ps -e 显示所有进程
    ps -f 显示完整格式的输出
    Ps -l 显示长列表(不常用)
    ps --forest 显示进程层级
    ps -ef --forest 前几个的组合使用
    

    实时监测进程

    top

    实时监测进程,q退出,d修改轮询间隔,f选择显示哪些字段字段d,F选择按哪个字段排序

    top 实时监测进程
    

    结束进程

    linux信号
    信号名称描述
    1HUP挂起
    2INT中断
    3QUIT结束运行
    9KILL无条件终止
    11SEGV段错误
    15TERM尽可能终止
    17STOP无条件停止运行,但不终止
    18TSTP停止或暂停,但继续在后台运行
    19CONT在STOP或TSTP之后恢复执行
    kill

    kill命令通过进程id给进程发信号。默认情况发送TERM信号

    kill 123 尽可能杀死pid是123的进程
    kill -9 123 无条件杀死pid是123的进程
    
    killall

    通过进程名而不是PID来结束进程,支持通配符

    killall http* 杀死所有以http开头的进程
    

    监测磁盘空间

    挂载存储媒体

    mount

    给出两个简单例子

    mount 输出当前系统上挂载的设备列表,每行展示:媒体设备文件名、虚拟目录挂载点、文件系统类型、已挂载媒体的访问状态
    mount -t vfat /dev/sdb1 /media/disk  将vfat格式的u盘/dev/sdb1挂载到/dev/sdb1目录
    
    umount
    umount [directory|device] 这个命令可以通过设备文件或挂载点来指定要卸载的设备
    

    使用df命令

    df

    显示设备上还有多少磁盘空间

    df 显示每个有数据的已挂载文件系统使用情况
    df -h 同上,但是按照用户易读的形式显示数值
    

    使用du命令

    du

    du显示某个特定目录的磁盘使用情况

    du 当前目录下所有文件、目录、子目录的磁盘使用情况
    

    处理数据文件

    排序数据

    sort
    sort a.log 排序输出a.log内容,默认按照字典顺序
    sort -n a.log 排序输出a.log的内容,将他们识别成数字排序
    sort -M a.log 如果a.log以Jan等形式的三字符月份名开头,可以按照月份排序
    sort -t ':' -k 3 -n /etc/passwd 排序/etc/passwd文件,按冒号分段,然后按第三段排序,并且将其作为数字进行排序
    du -sh * | sort -nr 这里用了管道,查看当前目录下所有子文件、子文件夹的大小,然后当做数字倒排序(-r为倒排序)
    

    搜索数据

    grep

    查找文件内容

    grep [options] pattern [file] 查找某个文件中匹配pattern模式的字符的行
    grep three a.log 查找a.log文件中包含three的行
    grep -v three a.log 查找a.log文件中不包含three的行
    grep -n three a.log 查找a.log文件中包含three的行,并添加行号
    grep -c three a.log 统计a.log文件中包含three的有多少行
    grep -e three -e two a.log 查找a.log中包含three或two的行,-e可以用来指定多个匹配模块
    grep [tf] a.log 查找a.log中包含t或包含f的行
    
    egrep

    grep的衍生,支持POSIX扩展正则表达式

    fgrep

    grep的衍生,支持将匹配模式指定为用换行符分割的一列固定长度的字符串

    压缩数据

    gzip

    用来压缩文件

    gzip a.log 压缩a.log文件
    gzip my* 压缩my开头的所有文件(不压缩目录)
    
    gzcat

    用来查看压缩过的文本文件的内容

    gunzip

    用来解压文件

    归档数据

    tar
    tar -cvf test.tar test/ test2/ 创建test.tar的归档文件,还有test和test2目录内容
    tar -tf test.jar 列出test.jar的内容
    tar -xvf test.jar 从test.tar中提取内容
    

    第五章 理解shell

    shell的父子关系

    bash 从当前shell启动一个shell 
    bash 从刚启动的shell再启动一个shell
    ps --forest 展示进程树,可以看出父子关系
    

    进程列表

    echo $BASH_SUBSHELL
    pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls ; echo $BASH_SUBSHELL 这是一个命令列表,最后一行显示0,表示没有生产子shell
    (pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls ; echo $BASH_SUBSHELL) 这是一个进程列表,最后一行显示1,表示生产了一个子shell
    (pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls ; (echo $BASH_SUBSHELL)) 这是一个进程列表,最后一行显示2,表示生产了两个子shell
    

    别出心裁的子shell用法

    sleep
    sleep 10 休息10秒
    sleep 10 & 在后台休息10秒,马上输入后台作业号和进程id
    
    jobs
    jobs 显示当前运行在后台模式中的所有用户的进程
    jobs -l 显示当前运行在后台模式中的所有用户的进程以及它们的pid
    
    coproc

    协成可以同时做两件事:在后台生产子shell,并在这个子shell中执行命令

    coproc sleep 10 在后台创建shell并执行休眠10秒
    coproc My_Job { sleep 1000; } 在后台创建shell并执行休眠1000秒,为这个后台程序起名为My_Job,注意,格式要求严格,空格和分号需要严格按照格式
    

    理解shell的內建命令

    外部命令

    外部命令也被称为文件系统命令,是存在于bash shell之外的程序。执行他们时回创建出一个子进程,这种操作被称为衍生(forking)。

    ps -f 命令可以很清楚的看出,他创建了一个子进程,ps是一个外部命令
    
    which

    这个命令可以找出可执行命令的位置

    which ps 可以找出ps命令的位置(一般情况下是在/bin/ps)
    

    內建命令

    內建命令和shell编译在一起,不需要子进程执行,效率更高。

    type

    內建命令,可以查看命令的类型

    type cd 显示可执行命令cd的类型(会显示类似于shell builtin,说明是內建命令)
    type -a echo 显示可执行命令echo的类型,如果有多个,全部列出
    
    history

    內建命令,bash shell会记录用过的命令,可以唤回并重新使用

    history 显示最近用过的命令列表
    !! 执行理事列表中最近的命令
    history -a 强制将理事记录写入.bash_history文件,默认情况下退出时才会写入
    !1082 执行命令历史记录编号为1082的命令
    
    alias

    內建命令,可以为长远命令及其参数创建别名,减少输入量。别名仅在它所被定义的shell进程中才有效

    alias -p 查看当前可用别名
    alias li='ls -li' 为ls -li 命令创建别名li,以后直接执行li即可
    

    第六章 使用Linux环境变量

    什么是环境变量

    全局环境变量

    全局环境变量会对shell会话和所有生成的子shell都是可见的。

    printenv 或 env
    printenv 打印全局环境变量
    env 打印全局环境变量
    printenv HOME 打印名为HOME的全局变量
    echo $HOME 打印名为HOME的全局变量
    cd $HOME 进入HOME所指的目录
    

    局部环境变量

    局部环境变量只能在定义他们的进程中可见。

    set
    set 输出局部变量、全局变量及用户定义变量(比env、printenv更详细)
    

    设置用户定义变量

    用户定义变量需要用小写,避免重新定义系统环境变量(系统环境变量都是大写)带来的灾难

    my_var=Hello 定义my_var变量的值Hello;注意不能有空格
    my_var2='hello world' 定义my_var2变量的值为hello world;注意不能有空格,值中若有空格,用单引号括起来
    

    设置全局环境变量

    在设定全局环境变量的进程所创建的子进程中,该变量都是可见的。

    export

    使用export将用户已经定义好的局部环境变量导出到全局环境中。

    my_var=hello 创建局部环境变量my_var
    export my_var 将my_var导出到全局环境中
    

    删除环境变量

    unset
    unset my_var 删除名为my_var的环境变量
    

    设置PATH环境变量

    PATH=$PATH:/home/raul/Scripts 把PATH环境变量加上/home/raul/Scripts(PATH环境变量中用冒号分割)
    PATH=$PATH:. 把PATH环境变量加上当前目录
    

    定位系统环境变量

    登录shell

    /etc/profile 系统默认的主启动文件,每个用户登录时都会执行这个启动文件
    $HOME/.bash_profile 用户专属启动文件
    $HOME/.bashrc 用户专属启动文件
    $HOME/bash_login 用户专属启动文件
    $HOME/.profile 用户专属启动文件
    

    交互式shell进程

    如果bash shell不是登录系统时启动的(比如是在命令行提示符下敲bash时启动),那么启动的这个shell叫做交互式shell。它不会访问/etc/profile,只会检查$HOME/.bashrc文件

    非交互式shell

    通过BASH_ENV环境变量来配置需要执行的启动文件

    环境变量持久化

    全局性的环境变量可以在/etc/profile.d目录中创建一个以.sh结尾的文件,将全局环境变量设置放入其中
    个人环境变量放到$HOME/.bashrc中
    非交互式shell的设置文件配置到BASH_ENV环境中
    

    数组变量

    环境变量可以作为数组使用

    mytest=(one two three four five) 把一个数组存入mytest环境变量中
    echo $mytest 只会显示第一个值one
    echo ${mytest[2]} 显示数组的第三个值
    echo ${mytest[*]} 显示数组的所有值
    mytest[2]=seven 修改数组第三个值,改为seven
    unset mytest[2] 去掉数组第三个值(数组长度并未改变,该位置存放了‘空’)
    unset mytest 删除整个数组
    

    第七章、理解Linux的安全性

    Linux的安全性

    用户账户存在/etc/passwd文件,展示:用户登录名、用户密码、用户账户的UID、用户账户的组ID(GID)、用户账户的文本描述、用户HOME目录的位置、用户的默认shell

    用户密码存在/etc/shadow文件,暂时:用户登录名、加密后的密码、自上次修改密码后过去的天数(自1970.1.1开始计算)、多少天后才能更改密码、多少天后必须更改密码、密码过期前提前多少天提醒用户更改密码、密码过期后多少天禁用用户账户、用户账户被禁用的日期(自1970.1.1到当天的天数)、预留字段给将来使用

    添加新用户

    useradd
    useradd -D 查看添加新用户的默认配置
    useradd test 添加test用户
    useradd -D -s /bin/tsch 修改添加新用户时shell的默认值为/bin/tsch
    

    删除用户

    userdel
    userdel test 删除test用户
    userdel -r test 删除test用户,并且删除他的home目录和邮件目录
    

    修改用户

    usermod

    修改用户账户的字段

    参数有
    -l 修改用户账户的登录名
    -L 锁定账户,使用户无法登录
    -p 修改账户的密码
    -U 解除锁定,使用户能够登录
    
    passwd
    passwd 修改自己的密码
    passwd test 修改test账户的密码
    
    chpasswd
    chpasswd < users.txt 用users.txt中的内容来修改密码,该文件中的内容应该是userid:passwd的键值对
    
    chsh
    chsh -s /bin/csh test 修改test用户的默认shell为/bin/csh
    
    chfn

    修改用户在/etc/passwd文件中的备注字段中的存储信息

    chfn test 修改test的备注信息,会提示输入
    
    finger
    finger test 查看test用户的信息
    
    chage

    用来帮助管理用户账户的有效期

    使用Linux组

    组存在/etc/group文件下,分别展示:组名、组密码、GUID、属于该组的用户列表

    创建新租

    groupadd
    groupadd shared 创建名为shared的组
    usermod -G shared test 将test用户添加到shared组中
    

    修改组

    groupmod
    groupmod -n sharing shared 修改组shared的名字,改为sharing
    

    理解文件权限

    默认文件权限

    umask

    默认权限由umask设置,比较复杂

    umask 展示创建文件时的默认权限
    umask 026 设置创建文件时的默认权限为640(666-026),创建目录时的默认权限751(777-026)
    

    改变安全性设置

    改变权限

    chmod

    两种方式,8进制权限码或符号模式

    chmod 760 newfile 设置newfile的权限为 -rwxrw----
    chmod [ugoa...][+-=][rwxXstugo...]
    其中第一组定义了权限作用的对象:u代表用户、g代表组、o代表其他、a代表上述所有
    第二组定义了是想 在现有权限上增加权限(+),还是现有权限上移除权限(-),或是将权限设置成后面指定的值(=)
    第三组代表作用到设置上的权限:
    X:如果对象是目录或者它已有执行权限,赋予执行权限
    s:运行时重新设置UID或GID
    t:保留文件或目录
    u:将权限设置为跟属主一样
    g:将权限设置为跟属组一样
    o:将权限设置为跟其他用户一样
    
    chmod o+r newfile 给newfile的其他用户增加读权限
    chmod u-x newfile 移除newfile的属主的执行权限
    

    改变所属关系

    chown
    chown raul newfile 改变newfile的属主为raul
    chown raul.shared newfile 改变newfile的属主为raul,属组为shared
    chown .rich newfile 改变newfile的属组为rich
    chown raul. newfile 将newfile的属主和属组都改为raul
    chown -R raul newdir 递归的将newdir下的所有文件和目录的属主都改为raul
    
    chgrp
    chgrp shared newfile 修改newfile的属组为chgrp
    

    共享文件

    可以创建共享文件夹,如果有需要了解细节再仔细学习,下面给出方法

    mkdir testdir 创建共享目录
    chgrp shared testdir    将属组改为需要共享文件的组shared
    chmod g+s testdir 修改权限
    umask 002 所有用户的umask都需要改成002
    cd testdir  进入目录
    touch testfile  创建文件,这个文件的属组会是shared
    

    第八章、管理文件系统

    操作文件系统

    创建分区

    fdisk
    fdisk /dev/sdb 给存储设备/dev/sdb分区
    进入后,有如下有用的操作
    p 显示这个存储设备的详细信息
    n 创建新分区
    w 保存更改
    

    创建文件系统

    分区数据使用前,应先用某种文件系统对其进行格式化,每个文件系统相对应的格式化工具不同。

    mkefs   创建一个ext文件系统
    mke2fs  创建一个ext2文件系统
    mkfs.ext3   创建一个ext3文件系统
    mkfs.ext4   创建一个ext4文件系统
    mkreiserfs  创建一个ReiserFS文件系统
    jfs_mkfs    创建一个JFS文件系统
    mkfs.xfs    创建一个XFS文件系统
    mkfs.zfs    创建一个ZFS文件系统
    mkfs.btrfs  创建一个Btrfs文件系统
    

    示例

    sudo mkfs.ext4 /dev/sdb1 在/dev/sdb1分区上创建一个ext4文件系统
    

    格式化后,需要将这个文件系统挂载到虚拟目录中才能使用

    ls /mnt
    sudo mkdir /mnt/my_partition
    ls -al /mnt/my_partition/
    ls -dF /mnt/my_partition
    sudo mount -t ext4 /dev/sdb1 /mnt/my_partition
    ls -al /mnt/my_partition
    

    这种挂载方式是临时的,如果想linux启动时自动挂载,可以将其添加到/etc/fstab文件中

    文件系统的检查与修复

    fsck

    fsck可以检查和修复大部分类型的Linux文件系统(包含ext、ext2、ext3、ext4、ReiserFS、JFS、XFS)。需要先卸载目录再检查,检查完后再挂载。

    fsck options filesystem 对文件系统进行fsck命令
    -a 如果检测遇到错误,自动修复
    -A 检查/etc/fstab/文件中列出的所有文件系统
    -C 如果支持进度条功能,显示进度条
    -N 不进行检查,只显示哪些检查会执行
    -r 出现错误时提示
    -R 使用-A选项时跳过根文件系统
    -s 检查多个文件系统时,依次进行检查
    -t 指定要检查的文件系统类型
    -T 启动时不显示头部信息
    -V 在检查时产生详细输出
    -y 检测到错误时自动修复文件系统
    

    逻辑卷管理

    使用Linux LVM

    fsdisk中分区类型8e即表示这个粪污将会被用作Linux LVM系统的一部分,而不是一个直接的文件系统。

    fsdisk 命令,输入t,然后输入8e
    

    下一步是用分区创建实际的物理卷

    sudo pvcreate /dev/sdb1 创建实际的物理卷
    sudo pvdisplay /dev/sdb1 查看创建进度
    sudo vgcreate Vol1 /dev/sdb1 创建卷组
    sudo vgdisplay Vol1 查看刚创建的卷组的细节
    sudo lvcreate -l 100%FREE -n lvtest Vol1 创建逻辑卷lvtest(参数细节查看lvcreate --help或man lvcreate)
    sudo lvdisplay Vol1 查看刚创建的逻辑卷的详细情况
    

    逻辑卷创建后,还需要创建文件系统,挂载到虚拟目录中

    sudo mkfs.ext4 /dev/Vol1/lvtest 为逻辑卷创建ext4文件系统
    sudo mount /dev/Vol1/lvtest /mnt/my_partition 把逻辑卷挂载到/mnt/my_partition目录下
    

    其他命令

    vgchange 激活和禁用卷组
    vgremove 删除卷组
    vgextend 将物理卷加到卷组中
    vgreduce 从卷组中删除物理卷
    lvextend 增加逻辑卷的大小
    lvreduce 减小逻辑卷的大小
    

    第九章、安装软件程序

    基于Debian的系统

    用aptitude管理软件包

    aptitude工具本质上是apt工具和dpkg的前端,使用它有助于避免常见的软件安装问题,如软件依赖关系缺失、系统环境不稳定及其他一些不必要的麻烦。

    aptitude
    aptitude 进入aptitude的全屏模式
    aptitude show mysql-client 显示mysql-client的详情(以及是否已经安装等信息)
    
    dpkg
    dpkg -L vim-common 列出vim-common软件包所安装的全部文件
    dpkg --search /user/bin/xxd 查找某个特定文件属于哪个软件包
    

    用aptitude安装软件包

    aptitude search wine 查找所有名字中包含wine的软件包(如果行首显示i u则表示已经安装,显示p v说明这个包可用,但还没安装)
    sudo aptitude install wine 安装名字包含wine的软件包
    

    用aptitude更新软件

    sudo aptitude safe-upgrade 将所有已安装的包更新到软件仓库中的最新版本,会检查包之间的依赖关系,有利于系统稳定。
    aptitude full-upgrade 同safe-upgrade,但不会检查包与包之间的依赖关系。
    aptitude dist-upgrade 同safe-upgrade,但不会检查包与包之间的依赖关系。
    

    用aptitude卸载软件

    sudo aptitude remove wine 只删除软件包而不删除数据和配置文件
    sudo aptitude purge wine 同时删除软件包以及相关的数据和配置文件
    

    aptitude仓库

    /etc/apt/sources.list aptitude默认的软件仓库配置文件,如果需要自定义,修改这里(最好不要自定义,原始配置中的软件包版本不会互相冲突)
    

    基于Red Hat的系统

    列出已安装包

    yum
    yum list installed 查看系统上已经安装的包
    yum list xterm 查看xterm软件包的详细信息
    yum list installed xterm 查看xterm软件包是否已经安装
    yum provides /etc/yum.conf 查看/etc/yum.conf文件是属于哪个软件包
    

    用yum安装软件

    yum install xterm 安装xterm软件包
    yum localinstall package_name.rpm 手动安装下载好的package_name.rpm文件
    
    su
    su hadoop 切换hadoop用户
    su - hadoop 切换hadoop用户,并进入hadoop的家目录
    su - 切换到root用户,并进入root的家目录
    

    用yum更新软件

    yum list updates 列出所有已安装包的可用更新
    yum update package_name 更新指定的软件包
    yum update 更新所有可更新的包
    

    用yum卸载软件

    yum remove package_name 只删除软件包而保留配置文件和数据
    yum erase package_name 同时删除软件包和相关的配置和数据
    

    处理损坏的包依赖关系

    有时在安装多个软件包时,某个软件包的依赖关系可能会被另一个包的安装覆盖,这叫做损坏的包依赖关系。解决办法如下

    首先尝试

    yum clean all
    yum update
    

    如果不行

    yum deplist package_name 可以查看这个软件包所需要的库由那些软件提供,然后可以安装他们。
    

    如果还是不行

    yum update --skip-broken 更新所有软件包,忽略依赖关系损坏的那个包。这个虽然不能解决问题,但至少可以减少影响。
    

    yum软件仓库

    软件仓库的配置文件在/etc/yum.repos.d目录下

    yum repolist 查看现有软件仓库
    

    从源码安装

    首先下载源码包

    tar -zxvf name.tar.gz 解压缩软件包
    cd name 进入刚刚解压的软件包目录,查看README文件或AAAREADME文件。该文件中包含了软件安装所需要的操作
    

    下面三条为常用的从源码安装的步骤

    ./configure 这个命令检查Linux系统,确保有合适的编译器可以编译源代码,另外确保有正确的库依赖关系
    make 编译源码,创建可执行文件
    make install 安装编译好的可执行文件到系统中
    

    第十章、使用编辑器

    vim编辑器

    vim基础

    vim myprog.c 打开文件,如果文件不存在,则打开临时文件
    

    进入vim后有两种模式:普通模式和插入模式。刚打开时vim编辑器会进入普通模式。普通模式中,vim编辑器会将案件解释成命令。在插入模式下,vim会将在当前光标位置的输入插入到缓冲区。

    i 进入插入模式,若要退出插入模式回到普通模式,按下退出键(ESC)
    h 左移一个字符
    j 下移一行
    k 上移一行
    l 右移一个字符
    PageDown(或Ctrl+F) 下翻一屏
    PageUp(或Ctrl+B)上翻一屏
    G 移动到缓冲区的最后一行
    num G 移动到缓冲区中的第num行
    gg 移动到缓冲区的第一行
    

    在普通模式下输入冒号,会进入普通模式下的一个特别功能:命令行模式。在命令行模式中有如下命令:

    q 如果未修改缓冲区数据,退出
    q! 取消所有对缓冲区的修改并退出
    w filename 将文件保存到另一个文件中
    wq 将缓冲区数据保存到文件中并退出
    

    编辑数据

    在普通模式下,vim编辑器提供了一些命令来编辑缓冲区中的数据。

    x 删除当前光标所在位置的字符
    2x 删除从当前光标所在位置开始的2个字符
    dd 删除当前光标所在行
    5dd 删除从当前光标所在行开始的5行数据
    dw 删除当前光标所在位置的单词
    d$ 删除当前光标所在位置至行尾的内容
    J 删除当前光标所在行行尾的换行符(拼接行)
    u 撤销前一编辑命令
    a 在当前光标后追加数据
    A 在当前光标所在行行尾追加数据
    r char 用char替换当前光标所在位置的单个字符
    R text 用text覆盖当前光标所在位置的数据,直到按下esc键
    

    复制和粘贴

    删除命令默认都会把删除内容放到一个单独的寄存器中,类似于剪切。
    p 取出寄存器中的数据并追加到当前光标位置
    yw复制一个单词
    y$复制到行尾
    v 移动光标到要开始复制的位置,按下v,光标所在位置已经高亮,这时可以移动光标覆盖想要复制的区域,最后按y来激活复制命令。
    

    查找和替换

    / 在普通模式下按斜线,就是查找命令,输入查找的命令后按回车。如果没有找到,会报错,如果找到了,会显示光标后第一个(如果光标后没有,则从缓冲区第一行开始搜索),如果要查看下一个,键入n或者键入/后键入回车。
    :s/old/new/ 命令行模式中使用,vim编辑器会调到old第一次出现的地方,并用new替换
    :s/old/new/g 将当前行的所有old替换成new
    :n,ms/old/new/g 替换行号n和m之间的所有old
    :%s/old/new/g 替换整个文件中的所有old
    :%s/old/new/gc 替换整个文件中的所有old,但在每次出现时提示
    

    nano编辑器

    nano编辑器窗口的地步显示了各种命令及简要描述。脱字符(^)表示Ctrl键,组合键大小写不敏感。

    CTRL+C 显示光标在文本编辑缓冲区中的位置
    CTRL+G 显示nano的主帮助窗口
    CTRL+J 调整当前文本段落
    CTRL+K 剪切文本行,并将其保存在剪切缓冲区
    CTRL+O 将当前文本编辑缓冲区的内容写入文件
    CTRL+R 将文件读入当前文本编辑缓冲区
    CTRL+T 启动可用的拼写检查器
    CTRL+U 将剪切缓冲区中的内容放入当前行
    CTRL+V 翻动到文本编辑缓冲区中的下一页内容
    CTRL+W 在文本编辑缓冲区中所搜单词或短语
    CTRL+X 关闭当前文本编辑缓冲区,退出nano,返回shell
    CTRL+Y 翻动到文本编辑缓冲区中的上一页内容
    

    emacs编辑器

    emacs编辑器使用包括控制键(PC键盘上的Ctrl键)和Meta键的按键组合。Meta一般被映射到Alt键。emacs官方文档将Ctrl键缩写为C-,而Meta键缩写为M-。

什么是ALPHA?_cumtb2002的博客:什么是alpha测试 xiaojing0511的博客:Alpha测试和Beta测试的区别 SecondJanuary:Alpha测试(α测试) / Beta测试(β测试) 英雄哪里出来:??13万字《C语言动漫对话教程(入门篇)》??(建议收 xpj8888的博客:第三周 超参数调试、Batch正则化和程序框架:3. xpj8888的博客:wordpress插件管理(五)WP 数学公式插件 LaTeX xpj8888的博客:PyCharm2019.3.4 License key is in legacy form 大番薯:编程术语英汉对照 HashFlag的博客:Python基础 风信子的猫Redamancy的快乐星球:PRML - Chapter 02 Probability g5703129的博客:java学习笔记总结,持续更新中 晴天的专栏:怎样规划你毕业以后的人生 骑毛驴的猴的博客:【2020-11-04】JS逆向之某宝模拟登入 骑毛驴的猴的博客:【2020-11-05】Flask+uWGSI+Nginx的部署 骑毛驴的猴的博客:【2020-11-11】JS逆向之蘑菇街商品数据接口解 骑毛驴的猴的博客:【2020-11-16】Python反爬虫之字体反爬 骑毛驴的猴的博客:【2020-11-22】JS逆向之某团美食商铺数据获取 骑毛驴的猴的博客:【2020-11-26】不扣JS系列之某医保服务平台数 骑毛驴的猴的博客:【2020-11-30】猿人学任务一之js混淆 - 源码 骑毛驴的猴的博客:【2020-12-11】JS逆向之某某排污监测信息发布 骑毛驴的猴的博客:【2020-12-16】JS逆向之某变IP 骑毛驴的猴的博客:【2020-12-23】JS逆向之某在线监测分析平台 骑毛驴的猴的博客:【2021-01-05】JS逆向之B站模拟登入(含极验 骑毛驴的猴的博客:【2021-01-11】JS逆向之美团模拟登入 骑毛驴的猴的博客:【2021-01-14】JS逆向之招标投标公告服务平台 骑毛驴的猴的博客:【2021-01-22】JS逆向之七麦数据analysis获取 骑毛驴的猴的博客:【2021-01-27】JS逆向之某片滑块参数分析 骑毛驴的猴的博客:【2021-01-29】JS逆向之数美滑块参数分析 骑毛驴的猴的博客:【2021-02-05】JS逆向之某某银行理财产品 骑毛驴的猴的博客:【2021-02-19】JS逆向之365玩游戏平台(worke 骑毛驴的猴的博客:【2021-03-16】JS逆向之有赞滑块分析 骑毛驴的猴的博客:【2021-03-17】JS逆向之某实时票房榜数据解密 骑毛驴的猴的博客:【2021-03-23】JS逆向之站D爷免费代理 骑毛驴的猴的博客:小红书接口参数X-sign 骑毛驴的猴的博客:【2021-04-02】JS逆向之某查查pe端cookie分析 骑毛驴的猴的博客:【2021-07-15】JS逆向之网易云音乐登入--最新 骑毛驴的猴的博客:【2021-07-15】小红书web端数美验证码 骑毛驴的猴的博客:【2021-04-14】xhs小程序端滑块验证码 骑毛驴的猴的博客:【2021-04-23】JS逆向之某船舶物资采购平台动 骑毛驴的猴的博客:【2021-04-25】APP逆向之某智网加密数据 骑毛驴的猴的博客:【2021-05-06】JS逆向之微店登入ua 骑毛驴的猴的博客:【2021-05-07】JS逆向之①号店登入(含滑块) 骑毛驴的猴的博客:【2021-05-12】JS逆向之dy创作者平台登入滑块 骑毛驴的猴的博客:【2021-05-25】JS逆向之某酷视频搜索接口(面 骑毛驴的猴的博客:【2021-06-03】JS逆向之wm世界主页滑块 骑毛驴的猴的博客:【2021-06-07】JS逆向之同花顺cookie(最新v值 signature(最新)_骑毛驴的猴的博客:【2021-08-31】抖音web参数 骑毛驴的猴的博客:【2021-07-01】JS逆向之房xx滑块 骑毛驴的猴的博客:【2021-07-16】堆糖小程序 zes_96_骑毛驴的猴的博客:【2021-07-23】JS逆向之某乎x ASP.NET Core MVC 修改视图的默认路径及其实现原理解析 docker compose 一键部署分布式配置中心Apollo的过程详解 使用SQL SERVER存储过程实现历史数据迁移方式 Django框架之django admin的命令行详解 解决python将xml格式文件转换成txt文件的问题(xml.etree方法) 网站加速哪家强?四大免费CDN服务评测大PK php session无法传值怎么办 macbook pro怎么安装php7 高质量笔记来了!关于PHP7性能优化 php轻松实现可爱的随机头像 微信公众账号怎么注册申请?微信公众账号注册流程 微信公众平台服务号、订阅号和企业号之间有什么区别? android Chronometer控件使用大全 关于python变量的引用以及在底层存储原理 SpringBoot 在项目启动之后执行自定义方法的两种方式小结 uniapp实现滑动评分效果 vue中LocalStorage与SessionStorage的区别与用法 SEO案例分析 alimama做SEO引流量的方法 如何解决php图片名中文乱码问题 php命令行输出乱码怎么办