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