Linux命令之命令查找方式


1 命令类型

    linux中命令类型分为两类,一类为shell中自带的命令,即内部命令,而其它的在文件系统之上的命令程序,即外部命令.

        内部命令的优点: 命令程序在内存中,使用更快捷

        相关命令: type,enable
            type - 查看命令类型(自身也是内部命令)
                type COMMAND

            enable - 禁用或启用某指定内部命令
                enable [options] COMMAND
                    enable 列出所有内部命令
                    enable -n COMMAND 禁用指定内部命名
                    enable COMMAND 启用指定内部命令

2 外部命令查找顺序

    命令的查找在系统上,实质为查找某路径下的命令程序.
    Linux中通过PATH变量保存系统查找的路径.找到的程序文件正常执行后,会将其找到的文件路径保存至hash表中.

        hash表,用于缓存已经执行成功后的命令路径,保存至特定的内存空间中.

        相关变量:
            PATH变量保存的默认值(CentOS6.x)
            # echo $PATH   
            /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin
            :/usr/sbin:/usr/bin:/root/bin

        相关命令: which,whereis,hash

            which - 显示命令完整路径
                which COMMAND
            whereis - 显示命令路径及帮助文档路径
                whereis COMMAND
            hash - 忘记或显示hash表中缓存信息
                hash 列出hash表信息
                hash -d COMMAND  删除hash表中指定命令的缓存
                hash -r 清空hash表

3 命令别名

    alias - 命令别名创建

        alias name='VALUE'

        示例:
            alias hh='echo hhhh'

    unalias - 取消别名

        unalias NAME

4 查找顺序证明

  • 4.1 hash与PATH的顺序

    准备环节:
        查看whoami所在路径
        # which whoami
        /usr/bin/whoami
        显示当前PATH值
        # echo $PATH
        /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin
        :/usr/bin:/root/bin
        清空hash表
        # hash -r
        # hash
        hash: hash table empty
    
    实验步骤:
        先执行whoami,让其路径保存至hash表中.
        再将whoami文件移至PATH的其它目录下.
        此时再次执行whoami命令,如果whoami命令正常显示,
        则说明是在PATH中找到whoami程序文件,则查找顺序是PATH优先于hash,反之亦然.
    
        # whoami        
        root
        # hash    
        hits    command
        1    /usr/bin/whoami
        # mv /usr/bin/whoami /bin      
        # whoami           
        -bash: /usr/bin/whoami: No such file or directory
    
        无法找到,证明是在hash表中找到的whoami路径.因此hash优先于PATH.
  • 4.2 内部和外部的顺序

    准备环节:
    
        pwd是内部命令
        # type pwd
        pwd is a shell builtin
        pwd文件所在路径
        # which pwd
        /bin/pwd
        清空hash表
        # hash -r 
        hash: hash table empty
        禁用pwd内部命令,使其使用外部命令执行pwd
        # enable -n pwd
    
    实验步骤:
    
        将pwd命令的路径缓存至hash表中,然后再将whoami命令复制到hash中记录的路径,命名为pwd.
        此时将pwd命令的内部命令启用,执行pwd.
        如果显示的结果为whoami的结果,则表示是从hash表中查询到的,否则是在内部命令查询到的.反之亦然.
    
        # pwd          显示当前所在工作目录路径
        centos6.example.com
        # hash
        hits    command
           1    /bin/pwd
        # cp /usr/sbin/whoami /bin/pwd      将whomai命令复制到/bin下并重命名为pwd
        cp: overwrite `/bin/pwd'? y
        # pwd         显示当前用户名
        root
        # enable pwd  启用pwd内部命令
        # pwd
        /root
    
        结果pwd显示的原信息,证明内部命令优先于外部命令
  • 4.3 alias和外部的顺序

    准备环节:
        定义一个与pwd同名的别名
        # alias pwd='echo hello'
        启用pwd内部命令
        # enable pwd
    
    实验步骤:
        使用pwd命令,查看结果.如果输出hello,则表示alias优于内部命令.反之亦然.
    
        # alias pwd='echo hello'
        # enable pwd
        # pwd
        hello
    
        结果表明alias优于内部命令

5 总结

    命令分为: 内部命令和外部命令
    命令: type,enable,hash,which,whereis,alias,unalias
    变量: PATH(保存命令查找路径,以:隔开)
    命令查询顺序为: 
        alias -> 内部命令 -> hash -> PATH

    补充: 
        在使用别名时,临时使用命令本身.实现方法:
            \COMMAND
            'COMMAND'
            "COMMAND"
            /PATH/TO/COMMAND  使用命令的绝对路径

            例:
                # alias echo='echo 123'
                # echo abc
                123 abc
                # \echo abc
                abc



上一篇:OpenCV学习笔记(三) 访问像素


下一篇:[svc]rsyslog及logrotate小结