Linux:查询类型的命令type
相关阅读Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482type是Linux中一个很实用的“类型查询”命令。它可以用来判断一个名字name在当前Shell环境中究竟会被解释成什么它可能是一个alias别名、keyword关键字、function函数名、builtin内建命令名或者是一个file可执行文件。其中查询某个名字是不是内建命令这一点尤其有用。下面是该命令的语法。用法 type [-aftp] [name...] 选项 Without options 指示每个名称被解释为什么类型显示第一个被搜索到的类型 -t 如果名称是别名(alias)、shell关键字(keyword)、函数名(function)、内建命令名(builtin)或磁盘文件名(file)则打印字符串为其中之一显示第一个被搜索到的类型 -p 如果第一个搜索到类型是file则显示其路径这意味着如果使用-t name时搜索到的不是file则不会显示 -P 强制在PATH进行搜索即使使用-t name时显示的不是file -a 以上所有选项描述中的“第一个”变为“全部”type命令可以对name进行搜索而这个name可以采用多种形式给出例如绝对路径以/开头相对路径以./或../开头纯名字也就是说下面这三种写法都是可以接受的本文随后的所有实验是在ReadHat 7操作系统下进行的。[***EDA bin]$ type /usr/bin/ls ./ls ls #注意当前工作文件夹 /usr/bin/ls is /usr/bin/ls ./ls is ./ls ls is aliased to ls --colorauto #这体现了搜索顺序中别名(alias)大于文件名(file)可以看到在上面的例子中使用纯名字ls搜索的结果显示为一个别名(alias)这就体现了type命令的搜索顺序。1、搜索name是否为别名如果name使用绝对路径或相对路径则不可能搜索到因为/不能存在于alias的名字中。2、搜索name是否为Shell关键字。3、搜索name是否为函数名它在内建命令前因为一个函数优先于同名内建命令。4、搜索name是否为一个内建命令如history之类的内建命令是无法被whereis都搜索到的注意某些内建命令可能会提供可执行的文件比如echo、alias等。5、搜索name是否为一个文件这个文件需要是可执行状态如提供的是纯名字则会在$PATH的路径内搜索否则按照name给出的路径搜索。可以留意的是type命令显示的第一个文件搜索结果也就是使用纯名字不使用绝对路径和相对路径时Bash在$PATH中搜索到的第一个搜索结到并执行的命令。 使用-t选项时type不会打印详细说明而是只输出搜索结果的类型名。例如[***EDA bin]$ type -t /usr/bin/ls ./ls ls #注意当前工作文件夹 file file alias-p选项只有在搜索到的第一个结果是file时才会输出路径。如果第一个搜索结果不是文件比如是alias、builtin或function那么就不会输出任何内容。例如[***EDA bin]$ type -p ls (nothing output) [***EDA bin]$ type -p ./ls #注意当前工作文件夹 ./ls [***EDA bin]$ type -p /usr/bin/ls /usr/bin/ls如果想看到某个名字在当前Shell环境下可能对应的全部结果可以使用-a选项从显示的顺序也可以看出在搜索的顺序中别名(alias)优先于文件名(file)。[zhangchenEDA bin]$ type -a ls ls is aliased to ls --colorauto ls is /usr/bin/ls ls is /bin/ls [zhangchenEDA bin]$ type -at ls alias file file其实上面说到的type的搜索顺序也是一个命令解析和执行顺序一条命令在解析时首先会经历别名(alias)替换随后检查是否为关键字然后检查命令名是否是一个函数、再检查是否是一个内建命令最后才到$PATH定义的路径去搜索(如果是使用纯名字)。下面我们用系统内建命令cd做一个测试首先创建一个叫cd的别名然后创建一个叫cd的函数最后使用-a选项和纯名字cd显示所有搜索结果下例没有展示关键字的搜索情况。[***EDA bin]$ type -a cd cd is a shell builtin #第一个搜索到 cd is /usr/bin/cd #注意即使内建命令$PATH中也可搜索到cd cd is /bin/cd [***EDA bin]$ [zhangchenEDA ~]$ function cd() { #创建一个函数 echo 111 } [***EDA bin]$ cd #此时cd会优先被当做函数名而不是内建命令名 111 [***EDA bin]$ type -a cd cd is a function #第一个搜索到 cd () { echo 111 } cd is a shell builtin cd is /usr/bin/cd cd is /bin/cd [***EDA bin]$ alias cdecho 222 #创建一个别名 [***EDA bin]$ cd #此时cd会首先被当做别名(alias)展开然后执行echo命令而不是直接作为函数名 222 [***EDA bin]$ type -a cd cd is aliased to echo 222 #第一个搜索到 cd is a function cd () { echo 111 } cd is a shell builtin cd is /usr/bin/cd cd is /bin/cd [***EDA bin]$ type -a alias alias is a shell builtin #第一个搜索到 alias is /usr/bin/alias #注意即使内建命令$PATH中也可搜索到alias alias is /bin/alias [***EDA bin]$ type -a history history is a shell builtin #不是所有内建命令$PATH中都可搜索到 通过本文可以看到type命令的作用并不只是简单地“查路径”而是帮助我们准确判断当输入一个名字时Bash究竟会把它解释成什么。它可以告诉我们这个名字到底是别名(alias)关键字(keyword)函数(function)内建命令(builtin)还是某个可执行文件(file)同时type命令也能够直观反映Bash在解析命令时的大致优先级顺序。因此在排查“为什么执行的不是预期命令”“为什么某个名字被覆盖了”“某个命令是不是内建命令”这类问题时type命令往往会非常有帮助。