zoukankan      html  css  js  c++  java
  • bash执行顺序:alias --> function --> builtin --> program

    linux bash的执行顺序如下所示:

     先 alias --> function --> builtin --> program 后 

    验证过程:

    1,在bash shell中有内置命令 test ,可以通过 type test 查看如下所示:

     test is a shell builtin 

    执行 test 时,看不到任何输出,唯一的响应是,新命令提示符被打印了:

    $ test
    $
    $ which test
      /usr/bin/test

    2,备份 /usr/bin/test ,将可执行的 hello copy到 /usr/bin/test 

    $ /usr/bin/test
      hello, world!

    在shell中执行 test :

    $ test
    $

    说明builtin的test执行优先于program的test

    原因是builtin命令避免了不必要的fork/execev调用,builtin命令理论上有更高的运行效率。

    3,alias(别名)

    $ alias test="ls -l"
      $ test
      total 9488
      drwxr-xr-x 12 falcon falcon    4096 2008-02-21 23:43 bash-3.2
      -rw-r--r--  1 falcon falcon 2529838 2008-02-21 23:30 bash-3.2.tar.gz

    说明:alias比builtin的test执行更优先

    4,function(函数)

    $ function test { echo "hi, I'm a function"; }
    $ test
      total 9488
      drwxr-xr-x 12 falcon falcon    4096 2008-02-21 23:43 bash-3.2
      -rw-r--r--  1 falcon falcon 2529838 2008-02-21 23:30 bash-3.2.tar.gz

    说明:function没有alias优先级高

    把alias去掉(unalias),执行test:

    $ unalias test
    $ test
    hi, I'm a function

    说明:function的优先级比builtin的优先级高

    在命令之前加上builtin,那么将直接执行builtin命令:

    $builtin test

    去掉某个function的定义,使用unset:

    $ unset test

    5,type -a/-t

    type -a会按照bash解析的顺序依次打印该命令的类型;type -t会给出第一个被解析的命令的类型

    $ type -a test
    test is a shell builtin
    test is /usr/bin/test
    $ alias test="ls -l"
    $ function test { echo "I'm a function"; }
    $ type -a test
    test is aliased to `ls -l'
    test is a function
    test ()
    {
        echo "I'm a function"
    }
    test is a shell builtin
    test is /usr/bin/test
    $ type -t test
    alias

    6,PATH执行顺序

    PATH指定的多个目录下有同名的程序的情况下,执行顺序是怎样的?在/usr/bin/,/bin,/usr/local/sbin这几个目录,通过type -P查看到底那个PATH下的先执行(-P参数强制到PATH下查找,而不管是别名还是内置命令)

    $ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    $ type -P test
    /usr/local/sbin/test
    $ rm /usr/local/sbin/test
    $ type -P test
    /usr/bin/test

    type -a也会显示类似的结果:

    $ type -a test
    test is aliased to `ls -l'
    test is a function
    test ()
    {
        echo "I'm a function"
    }
    test is a shell builtin
    test is /usr/bin/test
    test is /bin/test
  • 相关阅读:
    Passing Reference by value
    WPF中override ResourceDictionary中的设置的方法
    WPF中TextBox的PreviewMouseLeftButtonUp事件
    Attribute的理解和认识
    IIS添加服务
    Unix时间戳转换成C#中的DateTime
    KMP算法的实现
    IDA 宏定义
    实验吧-catalyst-system
    python整数转ASCII码
  • 原文地址:https://www.cnblogs.com/zhiminyu/p/14388997.html
Copyright © 2011-2022 走看看