《鸟哥的Linux私房菜》学习笔记(2)——Bash特

系统 1667 0

一、shell的基本概念:                              

shell  意思 是外壳,它是 离用户最近的程序。shell提供用户操作系统的接口, 我们通过 shell 将输入的命令与 内核 通信,使内核可以控制 硬件 来正确无误的工作。广义上的shell包含两类GUI和CLI。

  GUI:Gnome,KDE,Xface

  CLI:sh,csh,ksh,bash,tcsh,zsh(合法的shell要写入/etc/shells这个文件,系统某些服务在运行过程中,可能会去检查用户能够使用的shell)

  当用户登陆的时候,系统会分配一个shell来进行工作。默认会取得的shell记录在/etc/passwd文件中,可以看到hao这个用户默认取得的是bash。

      
        
          [hao@hao ~]$
        
      
      
        cat
      
       /etc/
      
        passwd
      
      
        

root:x:
      
      
        0
      
      :
      
        0
      
      :root:/root:/bin/
      
        bash

bin:x:
      
      
        1
      
      :
      
        1
      
      :bin:/bin:/sbin/
      
        nologin

...
      
      
        

hao:x:
      
      
        500
      
      :
      
        500
      
      :haohao:/home/hao:/bin/bash
    

  当有多个用户登陆的时候,会有多个进程,进程之间彼此互不相干,因为对于每个进程来说,它只认为当前主机上只有自己和内核存在。linux允许一个用户账号登陆多次 。

  进程是程序的副本,进程是程序执行的实例,是有生命周期的,由内核进行管理。

  用户工作环境,多个用户尽管使用的都是shell程序,但是各个用户的工作环境设定却可以各不相同,只不过默认情况下除了管理员,都是一样的。

  shell,子shell。可以在一个shell中在启动一个子shell。父shell和子shell都不能意识到彼此正在运行。很多时候对父shell的设定对子shell无效,子shell的设定对父shell也无效。下面的通过pstree命令可以看出该关系,如果退出到上一层bash,可以用exit命令。退到最上一层时候,会退出当前登陆。

      
        
          [hao@hao ~
        
      
      
        
          
            ]$
          
        
        bash


        
          
            [hao@hao 
          
        
      
      
        
          ~
        
      
      
        
          
            ]$
          
        
         pstree

init
      
      -+-NetworkManager-+-
      
        dhclient

     
      
      |                `-
      
        {NetworkManager}

     
      
      |-
      
        abrtd

     
      
      |-
      
        acpid

     ...
      
      
        
          |-sshd---sshd---sshd---bash---bash---pstree 
        
      
      |-
      
        trashapplet

    ...
      
      
        
          
            [hao@hao 
          
        
      
      
        
          ~
        
      
      
        
          
            ]$
          
        
         bash


        
          
            [hao@hao 
          
        
      
      
        
          ~
        
      
      
        
          
            ]$
          
        
         pstree        

init
      
      -+-NetworkManager-+-
      
        dhclient

     
      
      |                `-
      
        {NetworkManager}

     
      
      |-
      
        abrtd

     
      
      |-
      
        acpid

     ...
      
      
        |-sshd---sshd---sshd---bash---bash---bash---pstree

     
      
      |-
      
        trashapplet

    ...
      
    

  当然,bash下也可以嵌套运行csh,ksh

      
        
          [hao@hao ~
        
      
      
        
          
            ]$
          
        
         pstree

init
      
      -+-NetworkManager-+-
      
        dhclient

     
      
      |                `-
      
        {NetworkManager}

     
      
      |-
      
        abrtd

     
      
      |-
      
        acpid

     
      
      |-
      
        atd

    ...

     
      
      
        |-sshd---sshd---sshd---bash---pstree

     
      
      |-udevd---
      
        2
      
      *
      
        [udevd]

     `
      
      -
      
        wpa_supplicant


        
          
            [hao@hao 
          
        
      
      
        
          ~
        
      
      
        
          
            ]$
          
        
        csh


        
          
            [hao@hao 
          
        
      
      
        
          ~
        
      
      
        
          
            ]$
          
        
        pstree

init
      
      -+-NetworkManager-+-
      
        dhclient

     
      
      |                `-
      
        {NetworkManager}

     
      
      |-
      
        abrtd

     
      
      |-
      
        acpid

     
      
      |-
      
        atd

     ...

     
      
      
        |-sshd---sshd---sshd---bash---csh---pstree

     
      
      |-udevd---
      
        2
      
      *
      
        [udevd]

     `
      
      -wpa_supplicant
    

二、为什么学习shell                                

  • 一法通,万法通。虽然X Window将所有用到的软件都集成在一起,但它并非是一个完整的套件,所以某些时候当升级或者使用其他套件管理模块时,会遇到一些麻烦。
  • 远程管理:命令行界面比较快。Linux的管理经常需要远程联机,联机时命令行界面的传输速度比较快,而且较不容易出现断线或者信息外流。

三、shell的特性                                 :

1、命令历史、命令补全

  默认的命令记忆功能可以达到1000(环境变量HISTSIZE保存该数值)个,前一次登陆以前所执行过的命令历史记录在~/.bash_history,而本次登陆所执行的命令都被暂存在临时内存中,当注销后,该命令记忆才会被记录到~/.bash_history当中。

  查看命令历史(包含本次执行的history命令):history

    -c(clear):清空命令历史

    -d offset [n]:删除第offset条命令,history -d 500 10从第五百条命令往后删10条

    -w(wriet):将当前缓冲区中历史命令写入到历史文件中去。

    n(number):列出最近的n条命令行。

  history历史命令的使用技巧:

  !n:执行命令历史的第number命令

  !-n:执行命令历史记录的倒数第n条命令。

  !!:执行上一条命令。

  !vi:执行命令历史中最近一个以vi开头的命令。

      [hao@hao ~
      
        ]$ history

    
      
      
        1
      
        ll etc/
      
        

   ...

  
      
      
        141
      
      
        ls
      
       -
      
        a

  
      
      
        142
      
        LANG=
      
        en

  
      
      
        143
      
      
        ls
      
       -
      
        a

  
      
      
        144
      
        ll ~/
      
        .bash_history 

  
      
      
        145
      
      
        cat
      
       ~/
      
        .bash_history 

  
      
      
        146
      
      
        man
      
      
         history

  
      
      
        147
      
        history -
      
        w
      
      
        148
      
      
          history

  
      
      
        149
      
      
        cat
      
       ~/
      
        .bash_history

  
      
      
        150
      
      
          history

[hao@hao 
      
      ~]$ !
      
        141
      
      
        ls
      
       -
      
        a

.              .bash_history  .cache     .gconf           .gnote           .gvfs            .mozilla       .recently
      
      -used.xbel  .xsession-errors.old  ??????  ??????
      
        

..             .bash_logout   .config    .gconfd          .gnupg           .history         .nautilus      .
      
      
        ssh
      
                       ??????                ??????
      
        

.ICEauthority  .bash_profile  .dbus      .gnome2          .gstreamer
      
      -
      
        0.10
      
        .imsettings.log  .pulse         .viminfo             ?????????             ??????
      
        

.abrt          .bashrc        .esd_auth  .gnome2_private  .gtk
      
      -bookmarks   .local           .pulse-cookie  .xsession-errors     ??????                ??????
    

  命令补全:命令补全是在PATH环境变量下搜索命令。tab键自动补全(唯一),连敲两下tab键可以搜索所有已所敲字符为开头的命令。 

2、管道、重定向

3、命令别名

      
        
          root@hao:~
        
      
      
        
          
            #
          
        
        alias

alias 
      
      
        egrep
      
      =
      
        '
      
      
        egrep --color=auto
      
      
        '
      
      
        

alias 
      
      
        fgrep
      
      =
      
        '
      
      
        fgrep --color=auto
      
      
        '
      
      
        

alias 
      
      
        grep
      
      =
      
        '
      
      
        grep --color=auto
      
      
        '
      
      
        

alias l
      
      =
      
        '
      
      
        ls -CF
      
      
        '
      
      
        

alias la
      
      =
      
        '
      
      
        ls -A
      
      
        '
      
      
        

alias ll
      
      =
      
        '
      
      
        ls -alF
      
      
        '
      
      
        

alias 
      
      
        ls
      
      =
      
        '
      
      
        ls --color=auto
      
      
        '
      
    

alias CMDALIAS='COMMAND [options] [arguments]'

      
        
          root@hao:~#
        
      
       alias cls=
      
        '
      
      
        clear
      
      
        '
      
    

  在shell中定义的别名只在当前shell的生命周期中有效,别名的有效范围为当前shell进程,即使相同的用户在另一个shell中。若想让该别名永久有效,只需要将该别名写入shell应用程序的配置文件。

  撤销命令别名:unalias CMDALIAS;

  如果命令别名与原命令是一个名字,但是命令别名加入了一些选项。若此时想使用原命令,则需要使用\COMMAND。

4、命令替换

  把命令中某个子命令替换为其执行结果的过程叫做命令替换,如下面把子命令pwd的执行结果替换为命令echo的执行结果。

  格式$(command)或者`command`

      
        
          hao@hao:~$
        
      
      
        pwd
      
      

/home/
      
        hao


        
          
            hao@hao:
          
        
      
      
        
          ~$
        
      
      
        echo
      
      
        "
      
      
        This current /home/hao
      
      
        "
      
      
        

This current 
      
      /home/
      
        hao


        
          
            hao@hao:
          
        
      
      
        
          ~$
        
      
      cd /etc/sysctl.d/
      
        
           hao@hao:/etc/sysctl.d$
        
      
      
        echo
      
      
        "
      
      
        This current directory is $(pwd).
      
      
        "
      
      
        

This current directory is 
      
      /etc/
      
        sysctl.d.


        
          
            hao@hao:
          
        
      
      
        
          /etc/
        
      
      
        
          
            sysctl.d$
          
        
        cd


        
          
            hao@hao:
          
        
      
      
        
          ~$
        
      
      
        echo
      
      
        "
      
      
        This current directory is $(pwd).
      
      
        "
      
      
        

This current directory is 
      
      /home/hao.
    

  在当前目录下(./)创建一个以当前时间命名的txt文件。

      
        
          hao@hao:~$
        
      
      
        touch
      
       ./
      
        file
      
      -$(
      
        date
      
       +%F-%H-%M-%
      
        S).txt


        
          
            hao@hao:
          
        
      
      
        
          ~$
        
      
      
        ls
      
      
        

examples.desktop  
      
      
        file
      
      -
      
        2014
      
      -
      
        08
      
      -
      
        01
      
      -
      
        16
      
      -
      
        52
      
      -
      
        15
      
      .txt  ??????  ?????????  ??????  ??????  ??????  ??????  ??????  ??????
      
        
           hao@hao:~$ 
        
      
    

 补充,bash支持的三种引号:

  • 单引号'':强引用,不完成变量替换
  • 双引号"":弱引用,可以实现变量替换
  • 反引号``:命令替换

5、命令行编辑

  光标跳转:

    ctrl+a跳到行首

    ctrl+e跳到行尾

    ctrl+u删除光标至命令行首的内容

    ctrl+k删除光标至命令行尾的内容

    ctrl+->向右跳转一个单词

    ctrl+<-向左跳转一个单词

    ctrl+l清屏

6、命令行展开

7、文件名通配,globbing

 *: 任意长度的任意字符。/root/test目录下以a开始的任意文件

      
        
          root@hao:~/test#
        
      
       tree /
      
        root


      
      /
      
        root


      
      |--
      
         m


      
      |   `--
      
         n


      
      |       `--
      
         t

`
      
      --
      
         test

    
      
      |--
      
         a

    
      
      |--
      
         a123

    
      
      |--
      
         ab123

    
      
      |--
      
         abc

    
      
      |--
      
         x12

    
      
      |--
      
         xyz

    `
      
      --
      
         xyz123




      
      
        4
      
       directories, 
      
        7
      
      
         files


        
          
            root@hao:
          
        
      
      
        
          ~/test#
        
      
      
        ls
      
       a*
      
        

a  a123  ab123  abc
      
    

  ?: 匹配任意单个字符。文件名第二个字符是y的文件

      
        
          root@hao:~/test#
        
      
      
        ls
      
       ?y*
      
        

xyz  xyz123
      
    

  []: 匹配指定范围内的任意单个字符。 以字母开头,数字结尾的文件。还有一些特殊字符,可以使用man 7 glob查看,常用的如下。

  •   [[:space:]], 空白字符
  •   [[:punct:]], 标点符号
  •   [[:lower:]], 小写字符
  •   [[:upper:]], 大写字母
  •   [[:alpha:]], 大小写字母
  •   [[:diget:]], 数字
  •   [[:alnum:]],字母和数字
      
        
          ,root@hao:~/test#
        
      
      
        ls
      
       [a-zA-Z]*[
      
        0
      
      -
      
        9
      
      
        ]

a123  ab123  x12  xyz123
      
    

  以字母开头和结尾的文件名中间包含空格的文件

    
      
        root@hao:~/test# 
        
          touch 
          
            '
            
              a b
              
                '
                
                  
                     root@hao:~/test#
                  
                
                
                  ls
                  
                     a b a123 ab123 abc x12 xyz xyz123
                    
root@hao:~/test# ls [[:alpha:]]*[[:space:]]* [[:alpha:]] a

 [^]: 匹配指定范围之外的任意单个字符。以非a开头的所有文件

      
        
          root@hao:~/test#
        
      
      
        ls
      
       [^a]*
      
        

x12  xyz  xyz123
      
    

8、变量

9、编程

《鸟哥的Linux私房菜》学习笔记(2)——Bash特性


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论