Linux命令執行過程

1.查看CentOS7系統默認使用的shell類型

[root@CentOS7 ~]#echo $SHELL
/bin/bash

默認是bash,在系統啓動時就已經加載到內存中。一般,咱們把集成在shell中的命令就稱爲內部命令,可直接運行。 shell

2.shell中的命令類型

  • 內部命令:集成在shell中,可直接在內存中運行。 緩存

  • 外部命令:表現爲一個磁盤文件,會顯示完整路徑。外部命令一開始並無加載到內存中,而是在用戶執行命令的時候,系統臨時地經過PATH變量從磁盤中查找外部命令所在路徑而且加載到內存中運行的。

3.如何判斷一個命令的類型

type

[root@CentOS7 /]#help type
type: type [-afptP] name [name ...]
    Display information about command type.

例如: bash

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

根據上面所劃分的類型能夠看出more是一個外部命令,pwd是一個內部命令。 ide

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.啓用內部命令 ui

enable cmd

c.禁用內部命令或顯示已禁用的內部命令列表 code

禁用 orm

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

顯示 blog

[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

相關文章
相關標籤/搜索