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

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

    作者:[db:作者] 时间:2021-09-14 21:55

    第一部分 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-。