Linux中命令的分类,hash缓存表与别名

    命令的分类

    在Linnux中,平常工作用的是字符界面。Linux输入命令后,shell接收命令通过系统调用把命令送入内核中执行。
    *shell中的可执行命令分为两类

       1.内部命令:为shell自带命令,利用某种形式在开机后到到加载内存中

          help,enable      可以查内部有那些命令
    如:  
   [ting@CentOS7~]$help
   :                                      kill [-s sigspec | -n signum | -sig>
   [ arg… ]                             let arg [arg …]
   [[ expression ]]                       local [option] name[=value] …

   [ting@CentOS7~]$enable
   enable .
   enable :
   enable alias
   enable bg
   enable cd
         enable -n cmd   禁用内部命令
enable cmd      启用内部命令
enable -n       查看禁用命令
    如:
[ting@CentOS7~]$enable -n cd 
[ting@CentOS7~]$help   #查看是否禁用
cd [-L|[-P [-e]]] [dir]                readarray [-n count] [-O origin] [->
    command [-pVv] command [arg …]           打
的被禁用了
 
    [ting@CentOS7~]$ enable cd  # 启用内部命令
    [ting@CentOS7~]$help
    cd [-L|[-P [-e]]] [dir]                    readarray [-n count] [-O origin] [->
 

2.外部命令:在系统路径下有对应的可执行程序的文件

  which,whereis   查看外部命令和内部命令的路径
如:
[ting@CentOS7~]$which cat
       /usr/bin/cat
     [ting@CentOS7~]$whereis yus
      yus:[ting@CentOS7~]$whereis yes
      yes: /usr/bin/yes /usr/share/man/man1/yes.1.gz
      
     [ting@CentOS7~]$whereis cd   ## 查看内部命令的路径
      cd: /usr/bin/cd /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz
      *区分命令是外部命令或外部命令
  type COMMAND
 

    [ting@CentOS7~]$type cd
    cd is a shell builtin
    [ting@CentOS7~]$type cat
    cat is /usr/bin/cat
    查看是不是外部命令就type一下看看有没有系统路径;

问:为什么内部命令和外部命令都有可以执行程序的系统路径?
因为shell的的类型不同如通常我们是用bash,如果另用其他的shell如csh就会产生内部命令不一样,
我们通常把一些内部命令写到系统路径下对应的可执行程序的文件中。

—————————————————————————————————————————

hash缓存表及其常用用法:

 *Hash缓存表

    系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录
    到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH
    路径下寻找。利用hash缓存表可大大提高命令的调用速率
    echo $PATH:查找外部命令要找的路径的顺序:
    [ting@CentOS7~]$echo $PATH
    /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ting/.local/bin:/home/ting/bin
  

      *常用用法

hash      显示hash缓存
hash -l   显示h所以ash缓存的名字,一般做输入使用
hash -t  name  打印缓存中的name路径
hash -p  pth name 将命令的路径path(特别是一些常用并且路径很长的)起别名为name
hash -d  name   清除name的缓存
hash -r   清除所有的缓存
如:
[ting@CentOS7~]$hash     
    hits    command
     1    /usr/bin/cat
     4    /usr/bin/whereis
   
    [root@CentOS7/]#hash -l
    builtin hash -p /usr/bin/grep grep #–>最后一个单词是显示缓存的名字,它可以和路径的基名不一致
    builtin hash -p /usr/bin/ls ls
   
    [root@CentOS7/]#hash -d grep     #删除grep(名字)的路径
    [root@CentOS7/]#hash)
    hits    command
     3    /usr/bin/ls
   
    [root@CentOS7/]#hostname
    CentOS7.3
    [root@CentOS7/]#hash
    hits    command
     1    /usr/bin/hostname
    [root@CentOS7/]#hash -p /usr/bin/hostname  h  #将/usr/bin/hostname路径改名h
    [root@CentOS7/]#h
    CentOS7.3
    [root@CentOS7/]#hash -l
    builtin hash -p /usr/bin/hostname hostname
    builtin hash -p /usr/bin/hostname h   #——>缓存名字h与路径基名hostname不一致
   
________________________________________________________________________________

命令别名:

为什么要取别名?
就如人为什么有了名字,为什么要有一些其他的小名等别名,还不是为了方便我们叫,同理在
Linux中也一样,一个命令路径很长时,而且经常我们要用,这时别名就起了作用。
alias  newname = oldname     将oldname起别名为newname

  撤销别名:
unalias [-a] name [name]    加-a 为取消所有别名

[root@CentOS7~]#alias h=hostname

    [root@CentOS7~]#h
    CentOS7.3

———————————————————————————————————————————————————————————

命令的优先级 :

a.外部命令与内部命令优先级比较(用pwd举例)

[root@CentOS~]#type pwd
    pwd is a shell builtin
    [root@CentOS~]#enable -n pwd   # 禁用内部命令 
    [root@CentOS~]#pwd
     /root
    [root@CentOS~]#type pwd        
    pwd is /bin/pwd                 #pwd是外部命令
    [root@CentOS~]#enable pwd       #启用内部命令
    [root@CentOS~]#pwd               
    /root
    [root@CentOS~]#type pwd         #—-> 说明内部命令比外部命令优先级高
    pwd is a shell builtin

  结论:
            内部命令比外部命令优先级高
  
别名有内部命令优先级比较

[root@CentOS7~]#alias pwd=hostname        #将hostname起别名叫pwd
    [root@CentOS7~]#pwd                       #输入pwd如果结果是/,那么就是内部命令优先级比
    CentOS7.3                                 #外部优先级高,反正则是输出hostname的结果CentOS
    [root@CentOS7~]                           #那么别名优先级比内部优先级高

      结论:
             别名优先级比内部优先级高

SO:别名优先级高于内部命令高于外部命令



原创文章,作者:m25Chronos,如若转载,请注明出处:http://www.178linux.com/80945

(0)
m25Chronosm25Chronos
上一篇 2017-07-15 21:02
下一篇 2017-07-15 21:09

相关推荐

  • Centos6系统救援模式

    CentOS 6系统救援模式 在学习了CentOS 5、6系统启动流程与启动故障排除之后,为了加深印象进行了如下破坏性尝试。 删除/boot目录与/etc/fstab文件后尝试修复系统 1. 首先是第一步删除/boot目录与/etc/fstab 删除/boot /etc/fstab 可以看到虽然boot目录无法删除但是目录中的文件已经全部删掉了。 2. 重新…

    Linux干货 2016-11-24
  • 文本处理工具(一)

    文本处理工具 查看工具 cat;tac;rev;more cat 连接文件,并打印到标准输出上。 注意:当文件比较大的时候,文本在屏幕上一闪而过,导致无法看清内容,所以对于较大的文件建议结合着more,less等命令结合来用。 使用方法: -E: 显示行结束符$ -n: 对显示出的每一行进行编号 空行也加行号 -A:显示所有控制符 相当于-ETV -b:非空…

    2017-06-01
  • 马哥教育21期网络班—第一周课程+练习

    计算机的组成及功能 根据冯·诺依曼原理 现在计算机有五部分组成 分别是:运算器、控制器、存储器、输入设备和输出设备 现在把运算器和控制器做到一块就是所谓的CPU CPU = 运算器+控制器 存储器:memory 用于存储信息的记忆设备,存储器分为ROM和RAM 编址存储设备 ROM:只读存储器,寻址地址空间的组成部分 RAM:随机存储器 输入和输出设备: 输…

    Linux干货 2016-06-26
  • java基础篇—内存分析

    Java的并发采用的是共享内存模型(而非消息传递模型),线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现 同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。 1、多线程通信 1.1 内存模型 Java线程之间的通信由Java内存…

    Linux干货 2015-03-16
  • 程序包的编译安装

    程序包的编译安装 之所以需要安装编译程序包,是为了能及时更新程序包,制作好的rpm包,版本一般都有点老了,所以编译安装是必报的,而且我们可以自己定义安装路径,想卸载直接删除就KO了; 在centos7.3环境下安装apache http服务: 1.首先获取最新的apache源码包下载到/root目录下; 2.检查安装环境,没有就安装环境:   记住…

    Linux干货 2017-03-09
  • 马哥教育网络班21期-第2周课程练习

    1、 Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 cp 复制、mv 剪切、rm 删除 tree,mkdir 2、 bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。 echo$ 查看命令执行状态返回值 。 返回0,则表示执行成功。 返回非零,则表示执行失败。(1-255) 3、请使用命令行展开功能来完成…

    Linux干货 2016-07-17