type命令

Last Updated: 2023-06-01 09:23:38 Thursday

-- TOC --

type用来判断一个命令,是Bash内部命令(builtin),还是外部命令,还可以判断命令的类型(alias,function或者...)。

For each NAME, indicate how it would be interpreted if used as a command name.

内部命令,外部命令

所谓内部命令,就是Bash自带的命令,builtin。而外部命令,一般都存放在/usr/bin目录下,是一个独立的程序或脚本文件,file

$ type echo
echo is a shell builtin
$ type ls
ls is aliased to `ls --color=auto'
$ type alias
alias is a shell builtin
$ type type
type is a shell builtin
$ type cd
cd is a shell builtin
$ type pwd
pwd is a shell builtin
$ type readlink
readlink is /usr/bin/readlink

很多不离手的命令,都是内部命令,包括type自己。这是因为内部命令的执行不用查找和fork子进程,在当前进程中执行,效率高!

-a参数

-a: display all locations containing an executable named NAME; includes aliases, builtins, and functions, if and only if the -p option is not also used.

有些命令的名称,既是内部命令,也有外部程序文件。bash首先执行builtin,不是builtin的话,才去search并执行外部程序。

$ type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
ls is /bin/ls

-a 参数能够把他们都显示出来。

escape builtin

这里就存在一个问题,当我们输入某个有多个executable的命令时,我们到底执行的是哪个呢?当然,默认一定是执行bash builtin的那个,因为快!

但也有一个方法,可以绕过bash builtin,去执行存放在/usr/bin/里面的那个程序,就是使用完整的pathname。(用\的方法,貌似不好用...)

-t参数

-t: output a single word which is one of alias, keyword, function, builtin, file or NOT FOUND, if NAME is an alias, shell reserved word, shell function, shell builtin, disk file, or not found, respectively

-t参数应该最能体现出type命令的本来含义:

$ type -t ls
alias
$ type -at ls
alias
file
file
$ type -t if
keyword
$ type -t ln
file
$ type -t cp
file

NOT FOUND的时候,没有任何输出,用echo $?判断结果。

-P

-P: force a PATH search for each NAME, even if it is an alias, builtin, or function, and returns the name of the disk file that would be executed

强制对NAME进行PATH search,如果找到,返回disk file。

-p

-p: returns either the name of the disk file that would be executed, or nothing if type -t NAME would not return file

如果NAME默认执行顺序是disk file,返回这个disk file,否则没有输出。

-p/-P,都与disk file有关系。

bash执行各种命令的优先级顺序

按照优先级递减的顺序:

如果函数与脚本同名,函数会优先执行。但是,函数的优先级不如别名,即如果函数与别名同名,那么别名优先执行。

如果存在一个alias或function的name与某个命令同名,要强制执行命令,可以这样:

$ command <name>

带上一个command前缀!

如果要强制执行bultin,可以这样:

$ builtin <name>

带上一个builtin前缀!

如果要强制执行存在重名的file,使用完整路径:

$ /usr/bin/<name>

使用完整的pathname

也可以用enable命令,关闭默认的bulitin入口:

$ enable -n echo ls               # 禁用内置命令echo和ls    
$ enable ls                       # 重新启动内置命令ls
$ enable -a                       # 列出所有bash内置命令的状态

本文链接:https://cs.pynote.net/sf/linux/shell/202110162/

-- EOF --

-- MORE --