初识linux shell(时间仓促有些混乱)

时间:2019-06-12
本文章向大家介绍初识linux shell(时间仓促有些混乱),主要包括初识linux shell(时间仓促有些混乱)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Linux的四个部分:
    Linux内核
        系统内存管理(df)
        软件程序管理(ps)
        硬件设备管理
        文件系统管理        
    GNU工具
        用以处理文件的工具
        用以操作文本的工具
        用以管理进程的工具
    图形化桌面环境
        Linux发行版通常使用Ctrl+Alt组合键配合F1或F7来进入图形界面
    应用软件
[christine@server01 ~]$
用户ID名christine,系统名server01,bash shell提示符是美元符号( $ )可以自行修改提示符
root用户切换:su;切换到用户ly_sw:su ly_sw

Bath手册(man)
man l(+)2次tab  -- 查看l(大写L)开头的命令
man ls  -- 获取ls命令的帮助信息
空格键进行翻页,回车键逐行查看
    上箭头    向上移动一行
    下箭头    向下移动一行
    PgUp    向上翻一页
    PgDn    向下翻一页
    g    移动到第一页
    G    移动到最后一页
    q    退出
    /字符串    从当前页向下搜索字符串
    ?字符串    从当前页向上搜索字符串
man -f ls -- man命令帮助级别:LS(1)
man 1 crontab -- 查看一级别的帮助 
参考:
    linux内容区域
        1    普通用户可以执行的系统命令和可执行文件的帮助
        2    内核可以调用的函数和工具的帮助
        3    C语言函数的帮助
        4    设备和特殊文件的帮助
        5    配置文件的帮助
        6    游戏的帮助(个人版的Linux中是有游戏的)
        7    杂项的帮助
        8    超级用户可以执行的系统命令的帮助
        9    内核的帮助
    linux惯用节名
        Name  显示命令名和一段简短的描述
        Synopsis  命令的语法
        Confi guration  命令配置信息
        Description  命令的一般性描述
        Options  命令选项描述
        Exit Status  命令的退出状态指示
        Return Value  命令的返回值
        Errors  命令的错误消息
        Environment  描述所使用的环境变量
        Files  命令用到的文件
        Versions  命令的版本信息
        Conforming To  命名所遵从的标准
        Notes  其他有帮助的资料
        Bugs  提供提交bug的途径
        Example  展示命令的用法
        Authors  命令开发人员的信息
        Copyright  命令源代码的版权状况
        See Also  与该命令类型的其他命令

切换目录
http://www.pathname.com/fhs HFS标准(文件系统层次结构标准)
Linux目录名称
    /  虚拟目录的根目录。通常不会在这里存储文件
    /bin  二进制目录,存放许多用户级的GNU工具
    /boot  启动目录,存放启动文件
    /dev  设备目录,Linux在这里创建设备节点
    /etc  系统配置文件目录
    /home  主目录,Linux在这里创建用户目录
    /lib  库目录,存放系统和应用程序的库文件
    /media  媒体目录,可移动媒体设备的常用挂载点
    /mnt  挂载目录,另一个可移动媒体设备的常用挂载点
    /opt  可选目录,常用于存放第三方软件包和数据文件
    /proc  进程目录,存放现有硬件及当前进程的相关信息
    /root  root用户的主目录
    /sbin  系统二进制目录,存放许多GNU管理员级工具
    /run  运行目录,存放系统运作时的运行时数据
    /srv  服务目录,存放本地服务的相关文件
    /sys  系统目录,存放系统硬件信息的相关文件
    /tmp  临时目录,可以在该目录中创建和删除临时工作文件
    /usr  用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里
    /var  可变目录,用以存放经常变化的文件,比如日志文件
cd /bin       -- 进入bin目录
cd ../bin  -- 进入bin的父目录
cd bin     -- 进入当前目录下一个目录bin
cd                -- 返回当前用户起始目录
pwd               -- 验证当前目录(显示当前目录位置)

列出文件和目录
ls  -- 按列字母排序列出
ls -F     -- 区别文件和目录列出,文件后加正斜线区分/,文件后加*表示当前可执行的文件
ls -a   -- 列出包括文件前代·的隐藏文件
ls -F -R  -- 递归文件
ls -l   -- 长列表,过滤器使用可以限制查某一个文件:ls -l ly_sw_cs.sh,显示文件类型、字节大小、上次更改时间等信息
           支持通配符使用?*(?号代表一个字符,*号代表0个或多个字符)
           其他过滤器:
               ls -l my_scr[ai]pt  a 或 i
               ls -l f[a-i]ll      a 到 i
               ls -l f[!a]ll                排除 a

处理文件
touch tmp        -- 创建空文件,当文件存在更改修改时间
touch -a test_one        -- 更改访问时间
ls -l --time=atime test_one        -- 查看访问时间
cp tmp tmp01  -- 复制tmp,命名为tmp01
cp -i tmp Documents/    -- 如果Documents有tmp文件,会提示是否覆盖(此处使用相对路径)
cp -R Scripts/ Mod_Scripts        -- 递归复制文件中所有内容到Mod_Scripts
cp *script Mod_Scripts/
制表键补全(有多个会展示出所有的文件或目录,当前文件下有效)
ln -s data_file sl_data_file        -- 符号链接sl_data_file(注意不要软链接上创建软连接,容易断裂和混乱)
ln data_file sl_data_file                -- 硬链接(其实是同一个文件属性更改,如重命名,inode编码并没有改变)
ls -i *data_file        -- 查看文件inode编码(唯一)
ls -li *code_file        -- 显示了 * code_files的inode编号以及长列表
mv old_Scripts new_Scripts        -- 移动或重命文件(如果文件存在)
rm -i file        -- 删除文件(会有提示)
rm -f file    -- 强制删除文件(不会有提示,慎用)

处理目录(可以按照tree工具检查目录)
mkdir New_Dir        -- 创建新目录
mkdir -p New_Dir/Sub_Dir/Under_Dir        -- 创建多个目录和子目录
rmdir New_Dir        -- 删除空目录
rm -ri New_Dir    -- 每一级提示删除
rm -rf New_Dir    -- 不提示递归删除(目录和文件一起删除了)

#查看文件(类型,全部数据,部分数据)
#file tmp  -- 查看文件类型
#1.cat(所有展示一旦运行不能停止,不适合大型文件查看)
#    cat test1
#    cat -n test1    -- 给查看文件加上行号
#    cat -b test1  -- 给有文本的加上行号
#    cat -T test1  -- T 参数会用 ^I 字符组合去替换文中的所有制表符
#2.more(分页工具:会在显示每页数据之后停下来,q键退出)
#3.less(more的升级版,部分中文会转数字不好用)
#4.fail tmp  -- 默认查看倒数10行数据
#fail -n 2 tmp  -- 限制查看倒数2行数据
#head tmp        -- 默认查看前面10行数据
#head -5 tmp  -- 限制查看前五行数据

分段1:小结
本章涵盖了在shell提示符下操作Linux文件系统的基础知识。一开始我们讨论了bash shell,
之后介绍了怎样和shell交互。命令行界面(CLI)采用提示符来表明你可以输入命令。bash shell
提供了很多可用以创建和操作文件的工具。在开始操作文件之前,很有必要先了解一下Linux怎
么存储文件。本章讨论了Linux虚拟目录的基础知识,然后展示了Linux如何引用存储设备。在描
述了Linux文件系统之后,还带你逐步了解了如何使用 cd 命令在虚拟目录里切换目录。
在介绍如何进入指定目录后,我们又演示了怎样用 ls 命令列出目录中的文件和子目录。 ls
命令有很多参数可用来定制输出内容。可以通过 ls 命令获得有关文件和目录的信息。
touch 命令非常有用,可以创建空文件和变更已有文件的访问时间或修改时间。本章还介绍
了如何使用 cp 命令将已有文件复制到其他位置。另外还逐步介绍了如何链接文件,给出了一种简
单的方法可以实现在两个位置上拥有同一个文件且不用生成单独的副本。 ln 命令提供了这种链接
功能。
接着我们讲了怎样用 mv 命令重命名文件(在Linux中称为移动文件),以及如何用 rm 命令删除
文件(在Linux中称为移除文件),还介绍了怎样用 mkdir 和 rmdir 命令对目录执行相同的任务。
最后,本章以如何查看文件的内容作结。 cat 、 more 和 less 命令可以非常方便地查看文件
全部内容,而且 tail 和 head 命令还可查看文件中的一小部分内容。
下章将继续讨论bash shell的命令,并了解更多管理Linux系统时经常用到的高级系统管理
命令。

监测程序(三种风格)
Unix风格的 ps 命令参数:
    -A
    显示所有进程
    -N
    显示与指定参数不符的所有进程
    -a
    显示除控制进程(session leader ① )和无终端进程外的所有进程
    -d
    显示除控制进程外的所有进程
    -e
    显示所有进程
    -C cmdlist
    显示包含在 cmdlist 列表中的进程
    -G grplist
    显示组ID在 grplist 列表中的进程
    -U userlist
    显示属主的用户ID在 userlist 列表中的进程
    -g grplist
    显示会话或组ID在 grplist 列表中的进程 ②
    -p pidlist
    显示PID在 pidlist 列表中的进程
    -s sesslist
    显示会话ID在 sesslist 列表中的进程
    -t ttylist
    显示终端ID在 ttylist 列表中的进程
    -u userlist
    显示有效用户ID在 userlist 列表中的进程
    -F
    显示更多额外输出(相对 -f 参数而言)
    -O format
    显示默认的输出列以及 format 列表指定的特定列
    -M
    显示进程的安全信息
    -c
    显示进程的额外调度器信息
    -f
    显示完整格式的输出
    -j
    显示任务信息
    -l
    显示长列表
    -o format
    仅显示由 format 指定的列
    -y
    不要显示进程标记(process flag,表明进程状态的标记)
    -Z
    显示安全标签(security context) ① 信息
    -H
    用层级格式来显示进程(树状,用来显示父进程)
    -n namelist
    定义了 WCHAN 列显示的值
    -w
    采用宽输出模式,不限宽度显示
    -L
    显示进程中的线程
    -V
    显示 ps 命令的版本号
ps -ef
ps -l
    ?  UID:启动这些进程的用户。
    ?  PID:进程的进程ID。
    ?  PPID:父进程的进程号(如果该进程是由另一个进程启动的)。
    ?  C:进程生命周期中的CPU利用率。
    ?  STIME:进程启动时的系统时间。
    ?  TTY:进程启动时的终端设备。
    ?  TIME:运行进程需要的累计CPU时间。
    ?  CMD:启动的程序名称
    ?  F :内核分配给进程的系统标记。
    ?  S :进程的状态(O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵
    化,进程已结束但父进程已不存在;T代表停止)。
    ?  PRI :进程的优先级(越大的数字代表越低的优先级)。
    ?  NI :谦让度值用来参与决定优先级。
    ?  ADDR :进程的内存地址。
    ?  SZ :假如进程被换出,所需交换空间的大致大小。
    ?  WCHAN :进程休眠的内核函数的地址。
BSD风格的 ps 命令参数:
    T                           
    显示跟当前终端关联的所有进程
    a                           
    显示跟任意终端关联的所有进程
    g                           
    显示所有的进程,包括控制进程
    r                           
    仅显示运行中的进程   
    x                                                             
    显示所有的进程,甚至包括未分配任何终端的进程           
    U userlist                                             
    显示归 userlist 列表中某用户ID所有的进程               
    p pidlist                                              
    显示PID在 pidlist 列表中的进程                         
    t ttylist                                              
    显示所关联的终端在 ttylist 列表中的进程                
    O format                                               
    除了默认输出的列之外,还输出由 format 指定的列         
    X                                                      
    按过去的Linux i386寄存器格式显示                       
    Z                                                      
    将安全信息添加到输出中                                 
    j                                                      
    显示任务信息                                           
    l                                                      
    采用长模式                                             
    o format                                               
    仅显示由 format 指定的列                               
    s                                                      
    采用信号格式显示                                       
    u                                                      
    采用基于用户的格式显示                                 
    v                                                      
    采用虚拟内存格式显示                                   
    N namelist                                             
    定义在 WCHAN 列中使用的值                              
    O order                                                
    定义显示信息列的顺序                                   
    S                                                      
    将数值信息从子进程加到父进程上,比如CPU和内存的使用情况
    c                                                      
    显示真实的命令名称(用以启动进程的程序名称)           
    e                                                      
    显示命令使用的环境变量                                 
    f                                                      
    用分层格式来显示进程,表明哪些进程启动了哪些进程       
    h                                                      
    不显示头信息                                           
    k sort                                                 
    指定用以将输出排序的列                                 
    n                                                      
    和 WCHAN 信息一起显示出来,用数值来表示用户ID和组ID    
    w                                                      
    为较宽屏幕显示宽输出                                   
    H                                                      
    将线程按进程来显示                                     
    m                                                      
    在进程后显示线程                                       
    L                                                      
    列出所有格式指定符                                     
    V                                                      
    显示 ps 命令的版本号  
ps l
?  VSZ:进程在内存中的大小,以千字节(KB)为单位。
?  RSS:进程在未换出时占用的物理内存。
?  STAT:代表当前进程状态的双字符状态码。
    第一个字符采用了和Unix风格 S 列相同的值,表明进程是在休眠、运行还是等待。
    第二个参数进一步说明进程的状态
    ?  < :该进程运行在高优先级上。
    ?  N :该进程运行在低优先级上。
    ?  L :该进程有页面锁定在内存中。
    ?  s :该进程是控制进程。
    ?  l :该进程是多线程的。
    ?  + :该进程运行在前台 
GNU风格的 ps 命令参数:
    --deselect
    显示所有进程,命令行中列出的进程
    --Group grplist
    显示组ID在 grplist 列表中的进程
    --User userlist
    显示用户ID在 userlist 列表中的进程
    --group grplist
    显示有效组ID在 grplist 列表中的进程
    --pid pidlist
    显示PID在 pidlist 列表中的进程
    --ppid pidlist
    显示父PID在 pidlist 列表中的进程
    --sid sidlist
    显示会话ID在 sidlist 列表中的进程
    --tty ttylist
    显示终端设备号在 ttylist 列表中的进程
    --user userlist
    显示有效用户ID在 userlist 列表中的进程
    --format format
    仅显示由 format 指定的列
    --context
    显示额外的安全信息
    --cols n
    将屏幕宽度设置为 n 列
    --columns n
    将屏幕宽度设置为 n 列
    --cumulative
    包含已停止的子进程的信息
    --forest
    用层级结构显示出进程和父进程之间的关系
    --headers
    在每页输出中都显示列的头
    --no-headers
    不显示列的头
    --lines n
    将屏幕高度设为 n 行
    --rows n
    将屏幕高度设为 n 排
    --sort order
    指定将输出按哪列排序
    --width n
    将屏幕宽度设为 n 列
    --help
    显示帮助信息
    --info
    显示调试信息
    --version
    显示 ps 命令的版本号
GNU长参数中一个着实让人喜爱的功能就是 --forest 参数,它会显示进程的层级信息 

实时监控top
第一行显示了当前时间、系统的运行时间、登录的用户数以及系统的平均负载(最近1分钟,5分钟,15分钟)
    通常,如果系统的负载值超过了2,就说明系统比较繁忙了 
第二行显示了进程概要信息—— top 命令的输出中将进程叫作任务(task):有多少进程处在
    运行、休眠、停止或是僵化状态(僵化状态是指进程完成了,但父进程没有响应)。、
下一行显示了CPU的概要信息。 top 根据进程的属主(用户还是系统)和进程的状态(运行、
空闲还是等待)将CPU利用率分成几类输出 紧跟其后的两行说明了系统内存的状态。第一行说的是系统的物理内存:
总共有多少内存,当前用了多少,还有多少空闲。后一行说的是同样的信息,不过是针对系统交换空间(如果分配
了的话)的状态而言的    
    ?  PID:进程的ID。
    ?  USER:进程属主的名字。
    ?  PR:进程的优先级。
    ?  NI:进程的谦让度值。
    ?  VIRT:进程占用的虚拟内存总量。
    ?  RES:进程占用的物理内存总量。
    ?  SHR:进程和其他进程共享的内存总量。
    ?  S:进程的状态(D代表可中断的休眠状态,R代表在运行状态,S代表休眠状态,T代表
    跟踪状态或停止状态,Z代表僵化状态)。
    ?  %CPU:进程使用的CPU时间比例。
    ?  %MEM:进程使用的内存占可用内存的比例。
    ?  TIME+:自进程启动到目前为止的CPU时间总量。
    ?  COMMAND:进程所对应的命令行名称,也就是启动的程序名。
在 top 命令运行时键入可改变 top 的行为。
键入f允许你选择对输出进行排序的字段,键入d允许你修改轮询间隔。键入q可以退出 top 

Linux进程信号
    1  HUP
    挂起
    2  INT
    中断
    3  QUIT
    结束运行
    9  KILL
    无条件终止
    11  SEGV
    段错误
    15  TERM
    尽可能终止
    17  STOP
    无条件停止运行,但不终止
    18  TSTP
    停止或暂停,但继续在后台运行
    19  CONT
    在 STOP 或 TSTP 之后恢复执行
结束进程kill与killall,kill通过PID结束进程,killall支持进程名和通配符 
kill 3940
kill -s HUP 3940  -- 适用于不服管教的进程
killall http*            -- 适用于群杀 

监测磁盘空间
mount 命令提供如下四部分信息:
?  媒体的设备文件名
?  媒体挂载到虚拟目录的挂载点
?  文件系统类型
?  已挂载媒体的访问状态 
mount        -- 输出当前系统上挂载的设备列表 
mount -t vfat /dev/sdb1 /media/disk        
    -- mount -t type device directory丨type参数指定了磁盘被格式化的文件系统类型
    -- 手动将U盘/dev/sdb1挂载到/media/disk
mount 命令的参数:
    -a
    挂载/etc/fstab文件中指定的所有文件系统
    -f
    使 mount 命令模拟挂载设备,但并不真的挂载
    -F
    和 -a 参数一起使用时,会同时挂载所有文件系统
    -v
    详细模式,将会说明挂载设备的每一步
    -I
    不启用任何/sbin/mount.filesystem下的文件系统帮助文件
    -l
    给ext2、ext3或XFS文件系统自动添加文件系统标签
    -n
    挂载设备,但不注册到/etc/mtab已挂载设备文件中
    -p num
    进行加密挂载时,从文件描述符 num 中获得密码短语
    -s
    忽略该文件系统不支持的挂载选项
    -r
    将设备挂载为只读的
    -w
    将设备挂载为可读写的(默认参数)
    -L label
    将设备按指定的 label 挂载
    -U uuid
    将设备按指定的 uuid 挂载
    -O
    和 -a 参数一起使用,限制命令只作用到特定的一组文件系统上
    -o
    给文件系统添加特定的选项   
        -o 参数允许在挂载文件系统时添加一些以逗号分隔的额外选项。以下为常用的选项。                    
        ?  ro :以只读形式挂载。                                                   
        ?  rw :以读写形式挂载。                                                   
        ?  user :允许普通用户挂载文件系统。                                       
        ?  check=none :挂载文件系统时不进行完整性校验。                           
        ?  loop :挂载一个文件。 
umount /home/rich/mnt -- 卸载home/rich/下的mnt服务器(umount [directory | device ])
如果在卸载设备时,系统提示设备繁忙,无法卸载设备
这时可用lsof命令获得使用它的进程信息,然后在应用中停止使用该设备或停止该进程。lsof命令的用法很简单:
lsof /path/to/device/node,或者lsof /path/to/mount/point。
df
    ?  设备的设备文件位置;
    ?  能容纳多少个1024字节大小的块;
    ?  已用了多少个1024字节大小的块;
    ?  还有多少个1024字节大小的块可用;
    ?  已用空间所占的比例;
    ?  设备挂载到了哪个挂载点上。  
df -h -- 输出中的磁盘空间按照用户易读的形式显示,多少K,M,G  
du -h -- 输出当前磁盘占用情况
    ?  -c :显示所有已列出文件总的大小。
    ?  -h :按用户易读的格式输出大小,即用K替代千字节,用M替代兆字节,用G替代吉字节。
    ?  -s :显示每个输出参数的总计。
处理数据文件
sort file2 -- 按字符排序
sort -n file2 -- 按数值排序 
sort 命令参数:
    -b  --ignore-leading-blanks
    排序时忽略起始的空白
    -C  --check=quiet
    不排序,如果数据无序也不要报告
    -c  --check
    不排序,但检查输入数据是不是已排序;未排序的话,报告
    -d  --dictionary-order
    仅考虑空白和字母,不考虑特殊字符
    -f  --ignore-case
    默认情况下,会将大写字母排在前面;这个参数会忽略大小写
    -g  --general-number-sort
    按通用数值来排序(跟 -n 不同,把值当浮点数来排序,支持科学
    计数法表示的值)
    -i  --ignore-nonprinting
    在排序时忽略不可打印字符
    -k  --key=POS1[,POS2]
    排序从POS1位置开始;如果指定了POS2的话,到POS2位置结
    束
    -M  --month-sort
    用三字符月份名按月份排序
    -m  --merge
    将两个已排序数据文件合并
    -n  --numeric-sort
    按字符串数值来排序(并不转换为浮点数)
    -o  --output=file
    将排序结果写出到指定的文件中
    -R  --random-sort
    按随机生成的散列表的键值排序
    --random-source=FILE
    指定 -R 参数用到的随机字节的源文件
    -r  --reverse
    反序排序(升序变成降序)
    -S  --buffer-size=SIZE
    指定使用的内存大小
    -s  --stable
    禁用最后重排序比较
    -T  --temporary-directory=DIR
    指定一个位置来存储临时工作文件
    -t  --field-separator=SEP
    指定一个用来区分键位置的字符
    -u  --unique
    和 -c 参数一起使用时,检查严格排序;不和 -c 参数一起用时,仅
    输出第一例相似的两行
    -z  --zero-terminated
    用NULL字符作为行尾,而不是用换行符
sort -t ':' -k 3 -n /etc/passwd    -- -t 以分隔符:分隔,-k 3代表行第三列该列排序 
du -sh * | sort -nr  --  -r 参数将结果按降序输出,内存大小按降序排列 
du -sh * | sort -n   --  升序排序 
grep three file1     -- 搜索文件中的three的文本.如:grep ly_sw_cs /etc/passwd 查看ly_sw_cs用户是否可以使用系统
grep -v t file1   -- 输出不匹配t的行
grep -n t file1        -- 如果要显示匹配模式的行所在的行号,可加 -n 参数
grep -c t file1   -- 如果只要知道有多少行含有匹配的模式,可用 -c 参数  
grep -e t -e f -e ,file1         -- 输出了含有字符 t 或字符 f 或',' 的所有行  
grep [tf] file1   -- 正则表达式,t或f或',',同-e
gzip file1        -- 压缩文件file1,支持通配符gzip file1* (原文件已不在)
tar 命令的功能(归档):
    -A  --concatenate
    将一个已有tar归档文件追加到另一个已有tar归档文件
    -c  --create
    创建一个新的tar归档文件
    -d  --diff
    检查归档文件和文件系统的不同之处
    --delete
    从已有tar归档文件中删除
    -r  --append
    追加文件到已有tar归档文件末尾
    -t  --list
    列出已有tar归档文件的内容
    -u  --update
    将比tar归档文件中已有的同名文件新的文件追加到该tar归档文件中
    -x  --extract
    从已有tar归档文件中提取文件
    -C dir
    切换到指定目录
    -f file
    输出结果到文件或设备 file
    -j
    将输出重定向给 bzip2 命令来压缩内容
    -p
    保留所有文件权限
    -v
    在处理文件时显示文件
    -z
    将输出重定向给 gzip 命令来压缩内容   
tar -cvf test.tar test/ test2/   -- 创建了名为test.tar的归档文件,含有test和test2目录内容 (打包)
tar -tf test.tar                 -- 列出tar文件test.tar的内容(但并不提取文件) 
tar -xvf test.tar                -- 从tar文件test.tar中提取内容(解包)
以.tgz结尾的gzip文件是压缩过的tar文件可用命令 tar -zxvf filename.tgz 来解压  
小结:
本章讨论了Linux系统管理员和程序员用到的一些高级bash命令。 ps 和 top 命令在判断系统的
状态时特别重要,能看到哪些应用在运行以及它们消耗了多少资源。
在可移动存储普及的今天,系统管理员常谈到的另一个话题就是挂载存储设备。 mount 命令
可以将一个物理存储设备挂载到Linux虚拟目录结构上。 umount 命令用来移除设备。
最后,本章讨论了各种处理数据的工具。 sort 工具能轻松地对大数据文件进行排序,便于
组织数据; grep 实用工具能快速检索大数据文件来查找特定信息。Linux上有一些不同的文件压
缩工具,包括 bzip2、gzip 和 zip 。每种工具都能够压缩大型文件来节省文件系统空间。 tar 工
具能将整个目录都归档到单个文件中,方便把数据迁移到另外一个系统上。
下一章将讨论各种Linux shell及其使用。Linux允许你在多个shell之间进行通信,这一点在脚
本中创建子shell时非常有用。             
查看磁盘占用情况(du不指定都是默认当前目录)
du -sh /usr/local/  -- 不显示该路径下各子文件的大小
du -h  /usr/local/  -- 详细显示出各子文件的大小情况,去掉"s"
df -lh  /gbas       -- 磁盘各分区使用情况(可以不指定目录)


确定shell类型
    cat /etc/passwd        -- 从长列表中可以看出/bin/bash(bash shell)是一个可执行程序
    ps -f
    bash    -- 父shell生成一个子shell,可以通过exit依次退出
    ps --forest  方便查看进程层级关系
进程列表
    (pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)    -- 括号的加入使命令列表变成了
    进程列表,生成了一个子shell来执行对应的命令。
判断是否生成了子shell(子shell会拖慢进程,尽量少用)
  echo $BASH_SUBSHELL 返回0表明没有生成子shell,返回1表明生成了子shell
  pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls ; echo $BASH_SUBSHELL     
  (pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls ; echo $BASH_SUBSHELL)
  ( pwd ; (echo $BASH_SUBSHELL))        -- 两个括号会返回2,生成2个子shell
后台模式
sleep 10        -- 会话暂停10秒
sleep 10&   -- 后台等待
ps -f       -- 子shell在后台运行
jobs -l            -- 查看进程状态
(sleep 2 ; echo $BASH_SUBSHELL ; sleep 2)&    -- 将进程列入后台
coproc(略)-- 协程(前台后台同事运行)
shell的内建命令和外部命令
    当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)
    外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中
    ps 就是一个外部命令。你可以使用 which 和 type 命令找到它
    which ps
    type -a ps
    可以利用 type 命令来了解某个命令是否是内建的
    type cd
    type exit
    有些命令有多种实现。例如 echo 和 pwd 既有内建命令也有外部命令。要查看命令的不同实现,使用 type 命令的 -a 选项
    type -a echo
    type -a pwd
    对于有多种实现的命令,如果想要使用其外部命令实现,直接指明对应的文件就可以了。
    例如,要使用外部命令 pwd ,可以输入 /bin/pwd
history        -- 在这个例子中,只显示了最近的23条命令。通常历史记录中会保存最近的1000条命令。
!!                -- 唤回执行上一次操作
alias -p    -- 查看可用的别名
alias li='ls -li'        -- 可以使用 alias 命令创建属于自己的别名 li
小结:
本章讨论了复杂的交互式程序:GNU bash shell。其中包括理解shell进程及其关系,如何生
成子shell,以及子shell与父shell的关系。还探究了那些能够创建子进程的命令和不能创建子进程
的命令。
当用户登录终端的时候,通常会启动一个默认的交互式shell。系统究竟启动哪个shell,这取
决于用户ID配置。一般这个shell都是/bin/bash。默认的系统shell(/bin/sh)用于系统shell脚本,如
那些需要在系统启动时运行的脚本。
子shell可以利用 bash 命令来生成。当使用进程列表或 coproc 命令时也会产生子shell。将子
shell运用在命令行中使得我们能够创造性地高效使用CLI。子shell还可以嵌套,生成子shell的子
shell,子shell的子shell的子shell。创建子shell的代价可不低,因为还必须为子shell创建出一个全
新的环境。
在最后,我们学习了两种不同类型的命令:内建命令和外部命令。外部命令会创建出一个包
含全新环境的子进程,而内建命令则不会。相比之下,外部命令的使用成本更高。内建命令因为
不需要创建新环境,所以更高效,不会受到环境变化的影响。
shell、子shell、进程和衍生进程都会受到环境变量的影响。下一章,我们会探究环境变量的
影响方式以及如何在不同的上下文中使用环境变量。

#环境变量
    全局环境变量
    局部环境变量

查看环境变量
    env       -- 查看shell下的全局变量
    printenv     -- 查看shell下的全局变量
    printenv HOME -- 显示变量HOME的值
    echo $HOME    -- 显示变量HOME的值($)
    ls $HOME  -- 在HOME变量前面加$可以执行参数的命令 
    set            -- 输出全局变量、局部变量和用户自定义变量
设置环境变量(全局变量是大写。自定义局部变量请坚持小写,这能够避免重新定义系统环境变量可能带来的灾难)
    1.设置局部环境变量
        echo $my_variable  -- 设置局部环境变量(改变量名不存在)
        my_variable=Hello  -- 局部环境变量赋值(字符串或数字,含空格的字符串需要单引号界定首尾)
        echo $my_variable  -- 展示局部环境变量值(环境变量存在,展示值)
    2.设置全局环境变量(需先设置局部变量,再导入全局变量)
        echo $my_variable               -- 设置局部环境变量
        my_variable="I am Global now"        -- 局部环境变量赋值
        export my_variable                            -- 导入到全局变量
        echo $my_variable               -- 展示环境变量值
    3.删除环境变量
     unset my_variable        -- 删除环境变量

设置PATH变量
    echo $PATH
    PATH=$PATH:/home/christine/Scripts
    
怎样让环境变量的作用持久化
登录时作为默认登录shell(/etc/profile文件是系统上默认的bash shell的主启动文件)
作为非登录shell的交互式shell(如:bash进入子shell)
作为运行脚本的非交互shell(在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。
                                                    当它读到文件的结尾EOF,shell也就终止了)
最好是在/etc/profile.d目录中创建一个以.sh结尾的文件,把所有新的变量或修改过的变量全部放在此文件中(对所有用户)。
对于存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。这一点适用于所有类型的shell进程(仅对当前用户)。
     
bash shell支持的Bourne变量:
    CDPATH
    冒号分隔的目录列表,作为 cd 命令的搜索路径
    HOME
    当前用户的主目录
    IFS
    shell用来将文本字符串分割成字段的一系列字符
    MAIL
    当前用户收件箱的文件名(bash shell会检查这个文件,看看有没有新邮件)
    MAILPATH
    冒号分隔的当前用户收件箱的文件名列表(bash shell会检查列表中的每个文件,看看有没有新邮件)
    OPTARG
    getopts 命令处理的最后一个选项参数值
    OPTIND
    getopts 命令处理的最后一个选项参数的索引号
    PATH
    shell查找命令的目录列表,由冒号分隔
    PS1
    shell命令行界面的主提示符
    PS2
    shell命令行界面的次提示符
bash shell环境变量:
    BASH
    当前shell实例的全路径名
    BASH_ALIASES
    含有当前已设置别名的关联数组
    BASH_ARGC
    含有传入子函数或shell脚本的参数总数的数组变量
    BASH_ARCV
    含有传入子函数或shell脚本的参数的数组变量
    BASH_CMDS
    关联数组,包含shell执行过的命令的所在位置
    BASH_COMMAND
    shell正在执行的命令或马上就执行的命令
    BASH_ENV
    设置了的话,每个bash脚本会在运行前先尝试运行该变量定义的启动文件
    BASH_EXECUTION_STRING
    使用 bash -c 选项传递过来的命令
    BASH_LINENO
    含有当前执行的shell函数的源代码行号的数组变量
    BASH_REMATCH
    只读数组,在使用正则表达式的比较运算符=~进行肯定匹配(positive match)时,
    包含了匹配到的模式和子模式
    BASH_SOURCE
    含有当前正在执行的shell函数所在源文件名的数组变量
    BASH_SUBSHELL
    当前子shell环境的嵌套级别(初始值是0)
    BASH_VERSINFO
    含有当前运行的bash shell的主版本号和次版本号的数组变量
    BASH_VERSION
    当前运行的bash shell的版本号
    BASH_XTRACEFD
    若设置成了有效的文件描述符( 0 、 1 、 2 ),则 'set -x' 调试选项生成的跟踪输出
    可被重定向。通常用来将跟踪输出到一个文件中
    BASHOPTS
    当前启用的bash shell选项的列表
    BASHPID
    当前bash进程的PID
    COLUMNS
    当前bash shell实例所用终端的宽度
    COMP_CWORD
    COMP_WORDS 变量的索引值,后者含有当前光标的位置
    COMP_LINE
    当前命令行
    COMP_POINT
    当前光标位置相对于当前命令起始的索引
    COMP_KEY
    用来调用shell函数补全功能的最后一个键
    COMP_TYPE
    一个整数值,表示所尝试的补全类型,用以完成shell函数补全
    COMP_WORDBREAKS
    Readline库中用于单词补全的词分隔字符
    COMP_WORDS
    含有当前命令行所有单词的数组变量
    COMPREPLY
    COPROC
    含有由shell函数生成的可能填充代码的数组变量
    占用未命名的协进程的I/O文件描述符的数组变量
    DIRSTACK
    含有目录栈当前内容的数组变量
    EMACS
    设置为 't' 时,表明emacs shell缓冲区正在工作,而行编辑功能被禁止
    ENV
    如果设置了该环境变量,在bash shell脚本运行之前会先执行已定义的启动文件(仅
    用于当bash shell以POSIX模式被调用时)
    EUID
    当前用户的有效用户ID(数字形式)
    FCEDIT
    供 fc 命令使用的默认编辑器
    FIGNORE
    在进行文件名补全时可以忽略后缀名列表,由冒号分隔
    FUNCNAME
    当前执行的shell函数的名称
    FUNCNEST
    当设置成非零值时,表示所允许的最大函数嵌套级数(一旦超出,当前命令即被终止)
    GLOBIGNORE
    冒号分隔的模式列表,定义了在进行文件名扩展时可以忽略的一组文件名
    GROUPS
    含有当前用户属组列表的数组变量
    histchars
    控制历史记录扩展,最多可有3个字符
    HISTCMD
    当前命令在历史记录中的编号
    HISTCONTROL
    控制哪些命令留在历史记录列表中
    HISTFILE
    保存shell历史记录列表的文件名(默认是.bash_history)
    HISTFILESIZE
    HISTTIMEFORMAT
    最多在历史文件中存多少行
    如果设置了且非空,就用作格式化字符串,以显示bash历史中每条命令的时间戳
    HISTIGNORE
    由冒号分隔的模式列表,用来决定历史文件中哪些命令会被忽略
    HISTSIZE
    最多在历史文件中存多少条命令
    HOSTFILE
    shell在补全主机名时读取的文件名称
    HOSTNAME
    当前主机的名称
    HOSTTYPE
    当前运行bash shell的机器
    IGNOREEOF
    shell在退出前必须收到连续的 EOF 字符的数量(如果这个值不存在,默认是 1 )
    INPUTRC
    Readline初始化文件名(默认是.inputrc)
    LANG
    shell的语言环境类别
    LC_ALL
    定义了一个语言环境类别,能够覆盖 LANG 变量
    LC_COLLATE
    设置对字符串排序时用的排序规则
    LC_CTYPE
    决定如何解释出现在文件名扩展和模式匹配中的字符
    LC_MESSAGES
    在解释前面带有 $ 的双引号字符串时,该环境变量决定了所采用的语言环境设置
    LC_NUMERIC
    决定着格式化数字时采用的语言环境设置
    LINENO
    当前执行的脚本的行号
    LINES
    定义了终端上可见的行数
    MACHTYPE
    用“CPU ? 公司 ? 系统”(CPU-company-system)格式定义的系统类型
    MAPFILE
    一个数组变量,当 mapfile 命令未指定数组变量作为参数时,它存储了 mapfile 所读
    入的文本
    MAILCHECK
    shell查看新邮件的频率(以秒为单位,默认值是 60 )
    OLDPWD
    shell之前的工作目录
    OPTERR
    设置为1时,bash shell会显示 getopts 命令产生的错误
    OSTYPE
    定义了shell所在的操作系统
    PIPESTATUS
    含有前台进程的退出状态列表的数组变量
    POSIXLY_CORRECT
    设置了的话,bash会以POSIX模式启动
    PPID
    bash shell父进程的PID
    PROMPT_COMMAND
    设置了的话,在命令行主提示符显示之前会执行这条命令
    PROMPT_DIRTRIM
    用来定义当启用了 \w 或 \W 提示符字符串转义时显示的尾部目录名的数量。被删除的
    目录名会用一组英文句点替换
    PS3
    select 命令的提示符
    PS4
    如果使用了bash的 -x 选项,在命令行之前显示的提示信息
    PWD
    当前工作目录
    RANDOM
    返回一个0~32767的随机数(对其的赋值可作为随机数生成器的种子)
    READLINE_LINE
    当使用 bind –x 命令时,存储Readline缓冲区的内容
    READLINE_POINT
    当使用 bind –x 命令时,表示Readline缓冲区内容插入点的当前位置
    REPLY
    read命令的默认变量
    SECONDS
    自从shell启动到现在的秒数(对其赋值将会重置计数器)
    SHELL
    bash shell的全路径名
    SHELLOPTS
    已启用bash shell选项列表,列表项之间以冒号分隔
    SHLVL
    shell的层级;每次启动一个新bash shell,该值增加1
    TIMEFORMAT
    指定了shell的时间显示格式
    TMOUT
    select 和 read 命令在没输入的情况下等待多久(以秒为单位)。默认值为0,表示
    无限长
    TMPDIR
    目录名,保存bash shell创建的临时文件
    UID
    当前用户的真实用户ID(数字形式)
    #Linux权限
    Linux系统使用一个专门的文件来(用户基本信息存放:/etc/passwd)
    包含了如下内容:
        ?  登录用户名
        ?  用户密码(x并不代表密码,密码保存在另一个文件)
        ?  用户账户的UID(数字形式)
        ?  用户账户的组ID(GID)(数字形式)
        ?  用户账户的文本描述(称为备注字段)
        ?  用户HOME目录的位置
        ?  用户的默认shell
    现在,绝大多数Linux系统都将用户密码保存在另一个单独的文件中(叫作shadow文件,位置在/etc/shadow)
    su -- 切换到root账户,exit退出
    /usr/sbin/useradd -D   -- 系统默认值被设置在/etc/default/useradd文件中:
        ?  新用户会被添加到GID为 100 的公共组;
        ?  新用户的HOME目录将会位于/home/loginname;
        ?  新用户账户密码在过期后不会被禁用;
        ?  新用户账户未被设置过期日期;
        ?  新用户账户将bash shell作为默认shell;
        ?  系统会将/etc/skel目录下的内容复制到用户的HOME目录下;
        ?  系统为该用户账户在mail目录下创建一个用于接收邮件的文件;
添加新用户test
    useradd -m test
/usr/sbin/userdel -r test -- 删除用户(不加-r只删用户不删文件)
用户账户修改工具:
    usermod
    修改用户账户的字段,还可以指定主要组以及附加组的所属关系
    passwd
    修改已有用户的密码
    chpasswd
    从文件中读取登录名密码对,并更新密码
    chage
    修改密码的过期日期
    chfn
    修改用户账户的备注信息
    chsh
    修改用户账户的默认登录shell
添加用户组shared并将test用户加入(组信息存放:/etc/group)
    /usr/sbin/groupadd shared
    /usr/sbin/usermod -G shared test
修改组(-g修改GID,-n修改组名)
    /usr/sbin/groupmod -n sharing shared
文件权限
字段的第一个字符代表了对象的类型
    ?  - 代表文件
    ?  d 代表目录
    ?  l 代表链接
    ?  c 代表字符型设备
    ?  b 代表块设备
    ?  n 代表网络设备
    之后有3组三字符的编码。每一组定义了3种访问权限:
        ?  r 代表对象是可读的
        ?  w 代表对象是可写的
        ?  x 代表对象是可执行的
-rwxrwxr-x 1 rich rich 4882 2010-09-18 13:58 myprog
    ?  -   : 第一个字符代表文件
    ?  rwx :文件的属主(设为登录名rich)。
    ?  rwx :文件的属组(设为组名rich)。
    ?  r-x :系统上其他人(-代表没有放入可写权限)。
Linux文件权限码:
    权 限  二进制值  八进制值     描 述
    ---          000              0                    没有任何权限
    --x          001              1                    只有执行权限
    -w-          010              2                    只有写入权限
    -wx          011              3                    有写入和执行权限
    r--          100              4                    只有读取权限
    r-x          101              5                    有读取和执行权限
    rw-          110              6                    有读取和写入权限
    rwx          111              7                    有全部权限
符号模式改变权限
    [ugoa…][[+-=][rwxXstugo…]
    ?  u 代表用户
    ?  g 代表组
    ?  o 代表其他
    ?  a 代表上述所有
    现有权限基础上增加权限(+),现有权限基础上移除权限(-),或是将权限设置成后面的值(=)
        ? rwx:略。
        ?  X :如果对象是目录或者它已有执行权限,赋予执行权限。
        ?  s :运行时重新设置UID或GID。
        ?  t :保留文件或目录。
        ?  u :将权限设置为跟属主一样。
        ?  g :将权限设置为跟属组一样。
        ?  o :将权限设置为跟其他用户一样。
chmod o+rw tmp    -- tmp文件的其他用户增加读写权限
改变所属关系(root账户执行)
    chown 命令用来改变文件的属主,chgrp 命令用来改变文件的默认属组
    chown test tmp          -- tmp属主改变成test 
  chown test.sharing tmp  -- tmp属主改变成test,属组改变成sharing
  chown .sharing tmp      -- 属组改变成sharing
  chown test. newfile     -- 属主和属组改成test
  chgrp shared tmp        -- 属组改变成shared
共享文件(未成功,有误)
管理文件系统
    文件系统日志方法:
        数据模式  索引节点和文件都会被写入日志;丢失数据风险低,但性能差
        有序模式  只有索引节点数据会被写入日志,但只有数据成功写入后才删除;在性能和安全性之间取得了良好的折中
        回写模式  只有索引节点数据会被写入日志,但不控制文件数据何时写入;丢失数据风险高,但仍比不用日志好
操作文件系统
    fdisk 创建分区——sudo fdisk /dev/sdb
        fdisk 命令:
        a  设置活动分区标志
        b  编辑BSD Unix系统用的磁盘标签
        c  设置DOS兼容标志
        d  删除分区
        l  显示可用的分区类型
        m  显示命令选项
        n  添加一个新分区
        o  创建DOS分区表
        p  显示当前分区表
        q  退出,不保存更改
        s  为Sun Unix系统创建一个新磁盘标签
        t  修改分区的系统ID
        u  改变使用的存储单位
        v  验证分区表
        w  将分区表写入磁盘
        x  高级功能
    创建文件系统——sudo mkfs.ext4 /dev/sdb
        创建文件系统的命令行程序:
       工 具           用 途
        mkefs       创建一个ext文件系统
        mke2fs      创建一个ext2文件系统
        mkfs.ext3   创建一个ext3文件系统
        mkfs.ext4   创建一个ext4文件系统
        mkreiserfs  创建一个ReiserFS文件系统
        jfs_mkfs    创建一个JFS文件系统
        mkfs.xfs        创建一个XFS文件系统
        mkfs.zfs        创建一个ZFS文件系统
        mkfs.btrfs    创建一个Btrfs文件系统
    type mkfs.ext4    -- type命令判断工具是否可用
    新文件系统挂载(重启linux文件系统不会自动挂载,除非创建在/etc/fstab)
        ——sudo mkdir /mnt/my_partition  -- 创建挂载点
        ——sudo mount -t ext4 /dev/sdb /mnt/my_partition        -- 挂载
    文件系统的检查与修复
        fsck
        fsck 的命令行选项:
        -a  如果检测到错误,自动修复文件系统
        -A  检查/etc/fstab文件中列出的所有文件系统
        -C  给支持进度条功能的文件系统显示一个进度条(只有ext2和ext3)
        -N  不进行检查,只显示哪些检查会执行
        -r  出现错误时提示
        -R  使用 -A 选项时跳过根文件系统
        -s  检查多个文件系统时,依次进行检查
        -t  指定要检查的文件系统类型
        -T  启动时不显示头部信息
        -V  在检查时产生详细输出
        -y  检测到错误时自动修复文件系统
逻辑卷管理(未文件系统创建逻辑存储设备)
    逻辑卷管理布局:卷组、逻辑卷、物理卷(linux将每一个逻辑卷视为一个物理分区)
    LVM 允许你在Linux上用简单的命令行命令管理一个完整的逻辑卷管理环境
        功能三:快照(备份逻辑卷文件);条带化(跨多个物理硬盘创建逻辑卷);镜像(实时更新的逻辑卷的完整副本)
    使用LVM
        ①定义物理卷:
            通过t命名改变分区类型:t——8e——w(8e代表LVM,w保存)
            sudo pvcreate /dev/sdb1  -- 标记为LVM分区
            sudo pvdisplay /dev/sdb1 -- 查看创建进度( VG Name 内容为空,因为物理卷还不属于某个卷组)
        ②创建卷组
            sudo vgcreate Vol1 /dev/sdb1  -- 创建卷组Voll
            sudo vgdisplay Vol1                        -- 查看创建卷组细节
        ③创建逻辑卷
            lvcreate 的选项:
            -c  --chunksize     指定快照逻辑卷的单位大小
            -C  --contiguous    设置或重置连续分配策略
            -i  --stripes       指定条带数
            -I  --stripesize    指定每个条带的大小
            -l  --extents           指定分配给新逻辑卷的逻辑区段数,或者要用的逻辑区段的百分比
            -L  --size                   指定分配给新逻辑卷的硬盘大小
                --minor               指定设备的次设备号
            -m  --mirrors           创建逻辑卷镜像
            -M  --persistent       让次设备号一直有效
            -n  --name                   指定新逻辑卷的名称
            -p  --permission       为逻辑卷设置读/写权限
            -r  --readahead       设置预读扇区数
            -R  --regionsize       指定将镜像分成多大的区
            -s  snapshot               创建快照逻辑卷
            -Z  --zero                   将新逻辑卷的前1 KB数据设置为零
          sudo lvcreate -l 100%FREE -n lvtest Vol1  -- 为逻辑卷命名lvtest(指定卷组Voll)
          sudo lvdisplay Vol1        -- 查看逻辑卷创建细节  
        ④创建文件系统
            sudo mkfs.ext4 /dev/Vol1/lvtest
            sudo mount /dev/Vol1/lvtest /mnt/my_partition -- 挂载
        ⑤修改LVM
            Linux LVM命令:
            vgchange  激活和禁用卷组
            vgremove  删除卷组
            vgextend  将物理卷加到卷组中
            vgreduce  从卷组中删除物理卷
            lvextend  增加逻辑卷的大小
            lvreduce  减小逻辑卷的大小
安装软件程序
Linux中广泛使用的两种主要的PMS基础工具是 dpkg 和 rpm, 
    如:dpkg 会直接和Linux系统上的PMS交互,用来安装、管理和删除软件包。
            rmp 命令能够列出已安装包、安装新包和删除已有软件
基于 Red Hat 的系统(不同系统命令不一样)
yum list installed  -- 列出已安装包
yum list installed > installed_software  -- 重定向到installed_software方便用more查看
yum list xterm  -- 查看插件是否安装
yum provides /etc/yum.conf  -- 查看yum.conf文件的归属
yum install xterm  -- 安装xterm包
su -      -- 切换到root账户
也可以手动下载 rpm 安装文件并用 yum 安装,这叫作本地安装:yum localinstall package_name.rpm
yum list updates  -- 列出可用更新
yum update package_name  -- 对特定包更新
yum update   -- 对列表所有包更新
yum remove package_name  -- 只删除软件包而保留配置文件和数据文件
yum erase package_name   -- 要删除软件和它所有的文件
处理损坏包依赖关系(找到原因有update更新):
    yum clean all
    yum deplist package_name  -- 这个命令显示了所有包的库依赖关系以及什么软件可以提供这些库依赖关系
                                                             如:yum deplist xterm
    yum update --skip-broken  -- 忽略损害包更新其他包
yum repolist -- 从哪些仓库中获取软件
从源码安装软件:(略)

原文地址:https://www.cnblogs.com/TianMu/p/11008673.html