Linux中 别名、内部命令、外部命令、hash缓存表 系统调用时的优先级比较

Linux系统中别名、内部命令、外部命令、hash缓存表 优先级优先级比较

在我们平时使用Linux系统执行各种命令时,会发现命令在执行过程中会区分哪个优先执行,哪个其次执行,这里我们来做个试验证明一下。

别名:用alias命令来设置命令的别名。

内部命令:内部命令在系统启动时就调入内存,是常驻内存的。

外部命令:外部命令是系统的软件功能表现为一个文件,用户需要时才从硬盘中读入内存。

hash缓存表:linux系统下会有一个hash缓存表,当你刚开机时这个hash表为空,每当你执行过一条命令时,hash表会记录下这条命令的路径,就相当于缓存一样。

所以从上述我们可以得出: 内部命令>外部命令

内部命令>hash表

接下来我们来比较一下别名和内部命令的关系:

[[email protected] ]#type cd                                           确定CD是内部命令

cd is a shell builtin

[[email protected] ]#type touch                                      确定touch是外部命令

touch is /bin/touch

[[email protected] ]#alias cd=touch                                给touch取个别名叫CD

[[email protected] ]#cd                                                    运行这个命令

touch: missing file operand

Try `touch --help‘ for more information.                    系统报错,让你查看更多关于touch的帮助

[[email protected] ]#

通过运行一个同名的命令,证明系统先调用的是别名。

所以:

别名>内部命令

然后我们再来比较一下hash表和外部命令的关系:

[[email protected] ]#type who                                                    查看who的地址

who is /usr/bin/who

[[email protected] ]#cp /usr/bin/who /usr/local/bin/                复制一个新的who

[[email protected] ]#ls -l /usr/bin/who /usr/local/bin/who       看一下 两个除了位置其他都一样的who

-rwxr-xr-x. 1 root root 48952 Mar 23 02:52 /usr/bin/who

-rwxr-xr-x. 1 root root 48952 May 21 11:25 /usr/local/bin/who

[[email protected] ]#who                                                           使用一次让它进入hash缓存表

root     pts/1        2017-05-21 11:22 (172.17.250.52)

root     pts/2        2017-05-21 11:22 (172.17.250.52)

root     tty1         2017-05-21 11:22 (:0)

[[email protected] ]#type who                                                    看一下它使用的哪一个地址

who is hashed (/usr/local/bin/who)

[[email protected] ]#rm /usr/local/bin/who                                删除那个地址

rm: remove regular file `/usr/local/bin/who‘? y

[[email protected] ]#who                                                            再使用

-bash: /usr/local/bin/who: No such file or directory             找不到目录报错

[[email protected] ]#

这个找不到目录的报错也就说明了这个命令的执行是先去找hash缓存表里记录的地址,说明hash缓存表在命令执行时比外部命令更具有优先级。

也就证明:                            内部命令>hash>外部命令

综上所述:

命令执行优先级:                     别名>内部命令>hash>外部命令

时间: 2024-10-07 13:34:14

Linux中 别名、内部命令、外部命令、hash缓存表 系统调用时的优先级比较的相关文章

linux中的内部命令和外部命令

linux中的命令大致可分为两类,内部命令和外部命令 内部命令:也称shell内嵌命令: 外部命令:存放在一个文件中,使用时需要去文件中查找,这些文件被定义在$PATH [[email protected] ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin type命令可以查看命令类型,以区别是内部命令还是外部命令 例 [[email protected] ~]# type cd cd is a

如何解决C#编译中"csc不是内部或外部命令"的问题

安装完 VisualStudio 2010编译环境后,是不能用命令行直接编译写好的csc文件的,如果不配置环境变量,在命令提示符(cmd)中编译扩展名为cs的文件,会出现错误提示“csc不是内部或外部命令,也不是可运行的程序,或批处理文件”.这时只需配置好环境变量,就可以成功执行csc命令编译C#源码了. 解决方案: 使用记事本编写一个C#程序,保存后将扩展名改为cs,存储在D盘中.这个文件会成为本例中的一个样本.代码大意为向命令行中写下“i love u”. 找到NET Framework的安

解决C#编译中"csc不是内部或外部命令"的问题

安装完 VisualStudio 编译环境后,是不能用命令行直接编译写好的csc文件的,如果不配置环境变量,在命令提示符(cmd)中编译扩展名为cs的文件,会出现错误提示"csc不是内部或外部命令,也不是可运行的程序,或批处理文件".这时只需配置好环境变量,就可以成功执行csc命令编译C#源码了.使用记事本编写一个C#程序,保存后将扩展名改为cs,存储在D盘中.这个文件会成为本例中的一个样本.代码大意为向命令行中写下"Hello World". 1.在.NET Fr

python中的commands模块,执行出错:'{' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

最近发现了python的commands模块,查看了下源码,使用的popen封装的,形成三个函数getstatus(), getoutput(), getstatusoutput() 源码如下: def getstatus(file): """Return output of "ls -ld <file>" in a string.""" import warnings warnings.warn("co

win10的cmd中显示:telnet不是内部或外部命令也不是可运行的程序或批处理?

win10的cmd中显示:telnet不是内部或外部命令也不是可运行的程序或批处理? 摘录自:https://blog.csdn.net/haijing1995/article/details/66475546 telnet命令? telnet命令用于登录远程主机,对远程主机进行管理. 举个栗子:在cmd中运行telnet  localhost  8431  也就等同于在浏览器中输入localhost:8431 telnet 127.0.0.1 11211 用于连接 memcached 问题分析

Windows中安装jdk,出现javac不是内部或外部命令 也不是可运行的程序

在经过多次实验,终于解决了在dos窗口验证jdk是否安装成功的错误提示-----javac不是内部或外部命令 也不是可运行的程序 首先要明确的是 在新建 JAVA_HOME , CLASSPATH文件是在系统变量里创建,而不是在用户变量里创建. 在JAVA_HOME:E:\AUTMuLu\java\jdk   ----jdk的安装路径 CLASSPATH:  .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\bin; -

&#39;sudo&#39;不是内部或外部命令,,,,的解决办法

[说明] Windows系统从 Vista 版本开始加入了 UAC 机制,这导致没有足够权限的程序无法获取到一些关键资源.在 Linux 下我们可以使用 sudo 命令方便地提升当前程序的执行权限,但在 Windows 中却通常只能右键单击程序图标,再选择 "以管理员身份运行".这种必须使用鼠标点击的方式很不方便,尤其在我们希望自动化执行一些任务时更是显得碍手碍脚. 我们可以自己写一个运行在 Windows 系统的 sudo 命令工具. [源码] 'ShellExecute 方法 '作

android Studio keytool&#39; 不是内部或外部命令,也不是可运行的程序 或批处理文件

//android Studio  keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件 遇到这个问题好久了,一直没解决今天搜集了大量的资料,有的说什么Java没配置好,不是扯犊子吗?!Android Studio能打开,怎么可能是java环境变量配置问题. 搜了半天,自己有想了想鼓捣一个小时终于行了. 看到有人发帖说这个keytool是在java  的bin里面,然后我就找确实有,但是单击时打开闪退. 算了分步骤写吧  这样还简单. ①找到安装Java的路径比如我的是 ②打开

windows下scrapy框架学习笔记—&#39;scrapy&#39; 不是内部或外部命令

最近几天在深入的学习scrapy框架,但是装完各种需要的基础包之后却发现scrapy命令在别的路径下都用不了,我一开始是把python安装在F:\Python路径下的,安装了scrapy后它默认都会安装在这个路径下,scrapy在路径F:\Python\Scripts路径下,我的scrapy命令只能在此路径下用,因此创建什么工程也都只能在此文件下. 想了一下它的工作原理:它在F:\Python\Scripts路径下,就会在Scripts文件下存在一个scrapy批处理文件,那么在DOS下想要命令