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


    一、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、编程

  • 相关阅读:
    在ubuntu9中安装配置java postgresql pljava tsearch2
    Zend中配置Memcached
    PHP 截取字符串专题(转)
    网络执法官.P2P终结者等监控网络流量控制软件的原理和防范
    C++中的浮点数格式控制
    HTML教程
    网络执法官.P2P终结者等监控网络流量控制软件的原理和防范
    CodeGear RADstudio 2007+Sp3下载地址及破解
    HTML教程
    CodeGear RADstudio 2007+Sp3下载地址及破解
  • 原文地址:https://www.cnblogs.com/mingcaoyouxin/p/3895203.html
Copyright © 2020-2023  润新知