Linux命令执行过程
admin
2023-03-06 20:42:00
0
1.查看CentOS7系统默认使用的shell类型
[root@CentOS7 ~]#echo $SHELL
/bin/bash

默认是bash,在系统启动时就已经加载到内存中。通常,我们把集成在shell中的命令就称为内部命令,可直接运行。

2.shell中的命令类型
  • 内部命令:集成在shell中,可直接在内存中运行。

  • 外部命令:表现为一个磁盘文件,会显示完整路径。外部命令一开始并没有加载到内存中,而是在用户执行命令的时候,系统临时地通过PATH变量从磁盘中查找外部命令所在路径并且加载到内存中运行的。
3.如何判断一个命令的类型
type
[root@CentOS7 /]#help type
type: type [-afptP] name [name ...]
    Display information about command type.

例如:

[root@CentOS7 ~]#type more
more is /usr/bin/more
[root@CentOS7 ~]#type pwd
pwd is a shell builtin

根据上面所划分的类型可以看出more是一个外部命令,pwd是一个内部命令。

ps:内部命令集成在shell中,系统优先使用内部命令。

4.内部命令管理工具
enable
[root@CentOS7 /]#help enable
enable: enable [-a] [-dnps] [-f filename] [name ...]
    Enable and disable shell builtins.

a.查看内部命令

[root@CentOS7 ~]#enable
enable .
enable :
enable [
enable alias
enable bg
enable bind
enable break
enable builtin
enable caller
enable cd
...

b.启用内部命令

enable cmd

c.禁用内部命令或显示已禁用的内部命令列表

禁用

enable -n cmd
[root@CentOS7 ~]#enable -n cd
[root@CentOS7 ~]#enable -n echo

显示

[root@CentOS7 ~]#enable -n
enable -n cd
enable -n echo
5.外部命令执行后发生了什么?

先来看下用type命令判断两个外部命令发生的结果:

[root@CentOS7 ~]#type uname
uname is hashed (/usr/bin/uname)
[root@CentOS7 ~]#type ifconfig
ifconfig is /usr/sbin/ifconfig
是否发现uname命令的判断结果中多了个hashed字样,这是为啥?

因为在执行命令的时候,系统会先判断执行的命令是啥类型,如果是内部命令则直接运行,如果是外部命令就会根据系统PATH变量路径来查找该命令所在的路径然后运行,并且运行后会把该命令路径缓存在内存中,当下次运行时就不用再从PATH路径中挨个搜索了,而是直接在内存中找,这样不仅能减少磁盘压力,而且还能提高命令的执行效率。ifconfig命令的判断结果中之所以没出现hashed字样,是因为这个命令还没有被执行过。

6.命令缓存在内存中除了能提高执行效率还有啥“优势”?
[root@CentOS7 ~]#tty
/dev/pts/0
[root@CentOS7 ~]#uname -r
3.10.0-957.el7.x86_64
[root@CentOS7 ~]#which uname
/usr/bin/uname
[root@CentOS7 ~]#mv `!!` /usr/sbin/
mv `which uname` /usr/sbin/
[root@CentOS7 ~]#uname -r
bash: /usr/bin/uname: No such file or directory
[root@CentOS7 ~]#hash
hits    command
   1    /usr/bin/tty
   1    /usr/bin/which
   1    /usr/bin/mv
   2    /usr/bin/uname

有时候会因为一些需要或者误操作移动了命令的路径,再次执行的时候就会报“-bash: xxx: No such file or directory”这种错误,这是为啥呢?根据上面的示例来分析一下:

a.当外部命令第一次执行后就会被缓存到内存中,当下次再执行这条命令的时候bash就会直接从内存中去找;

b.但是,由于命令路径被移动了,而内存中缓存的却是原来的路径,故会报错,通过上面的hash命令来可以发现命令的当前路径和缓存在内存中的路径是不一致的。

可通过以下方法来解决该问题:

  • 执行hash -d cmd来删除命令被缓存在内存中的位置,再次执行就会使用被移动后的路径;

  • 使用没有执行过该命令的新虚拟终端或者伪终端来执行,但,执行时使用的会是移动后的路径,如下图:

Linux命令执行过程

ps:hits表示该命令路径被缓存命中的次数。
7.总结

前面比较了内部命令和外部命令的区别,发现内部命令的执行效率要比外部命令的高,因为内部命令直接内置在shell中,而外部命令是存在磁盘中的。但事实上还有一种命令优先级比内部命令还要高。

别名
[root@CentOS7 ~]#alias history='uname -r'
[root@CentOS7 ~]#history
3.10.0-957.el7.x86_64
[root@CentOS7 ~]#hash
hits    command
   1    /usr/bin/uname

可以看出显示的结果是别名执行得到的,当别名和原始命令同名,但是要使用原始命令的时候可以通过以下方式执行:

  • 'cmd'
  • '\cmd'
  • '/usr/bin/cmd'(外部命令)
    [root@CentOS7 ~]#\history 1
    179  \history 1
    [root@CentOS7 ~]#'history' 1
    180  'history' 1

    通过以上测试可以得出Linux命令执行的顺序如下:

别名>内部命令>hash缓存外部命令>PATH变量路径>command not found

相关内容

热门资讯

今日重磅消息“神赚棋牌.真的有... 家人们!今天小编来为大家解答神赚棋牌透视挂怎么安装这个问题咨询软件客服徽9752949的挂在哪里买很...
我来教教您“杭州麻将.到底有挂... 家人们!今天小编来为大家解答杭州麻将透视挂怎么安装这个问题咨询软件客服徽9784099的挂在哪里买很...
最新引进“摇钱树拼三张.究竟有... 最新引进“摇钱树拼三张.究竟有挂吗?”外卦神器下载您好,摇钱树拼三张这个游戏其实有挂的,确实是有挂的...
今日重大通报“同城乐吧.有没有... 网上科普关于“同城乐吧有没有挂”话题很是火热,小编也是针对同城乐吧作*弊开挂的方法以及开挂对应的知识...
终于明白“,17麻将.开挂神器... 家人们!今天小编来为大家解答,17麻将透视挂怎么安装这个问题咨询软件客服徽4282891的挂在哪里买...
今日重磅消息“神殿娱乐.开挂器... 今日重磅消息“神殿娱乐.开挂器?”详细开挂教程您好,神殿娱乐这个游戏其实有挂的,确实是有挂的,需要了...
今日重大通报“新畅游互娱.到底... 家人们!今天小编来为大家解答新畅游互娱透视挂怎么安装这个问题咨询软件客服徽9752949的挂在哪里买...
终于明白“熊猫牛牛.究竟有挂吗... 您好:熊猫牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款游戏...
重磅消息“亲友游戏.到底有挂吗... 家人们!今天小编来为大家解答亲友游戏透视挂怎么安装这个问题咨询软件客服徽9784099的挂在哪里买很...
终于了解“土豪赢三张.究竟有挂... 有 亲,根据资深记者爆料土豪赢三张是可以开挂的,确实有挂(咨询软件无需打...