1. 程式人生 > 實用技巧 >高階Linux運維工程師養成記-Linux命令執行過程和命令型別

高階Linux運維工程師養成記-Linux命令執行過程和命令型別

高階Linux運維工程師養成記-Linux命令執行過程和命令型別

高階Linux運維工程師養成記

Linux命令的執行過程

當用戶在終端上輸入命令並回車後,Shell會查詢該命令所對應的可執行程式或者程式碼,並分析後提交給核心分配資源將其執行起來。

Shell中可以執行的命令分為內建命令和外接命令兩種
內部命令是由shell自帶的(例如pwd,cd,echo都是內建命令),當系統啟動時載入到記憶體。
外部命令是在檔案系統路徑下有對應的可執行程式的檔案。

我們可以通過type命令來檢視命令的型別

pwd就是shell內建的命令

[root@centos8 ~]# type pwd
pwd is a shell builtin

cd也是shell內建的命令

[root@centos8 ~]# type cd
cd is a shell builtin

type也是內建命令

[root@centos8 ~]# type type
type is a shell builtin

hostname就是外接命令,其對應可執行程式的路徑是/usr/bin/hostname

[root@centos8 ~]# type hostname
hostname is /usr/bin/hostname

由於Linux上可用的Shell有很多種,因此不同Shell提供了不同的內部命令。

在執行命令如果內部命令和外部命令同名時優先執行內部命令。

例如echo命令既是內部命令,又是外部命令。可以使用type -a echo檢視

[root@centos8 ~]# type -a echo
echo is a shell builtin
echo is /usr/bin/echo

如果想要優先使用外部命令,可以使用enable命令來禁用內部命令,當輸入enable時,該命令會列出所有可以禁用的內部命令

[root@centos8 ~]# enable
enable .
enable :
enable [
enable alias
enable bg
enable bind
enable break
enable builtin
enable caller
enable cd
enable command
enable compgen
enable complete
enable compopt
enable continue
enable declare
enable dirs
enable disown
enable echo
enable enable
enable eval
enable exec
enable exit
enable export
enable false
enable fc
enable fg
enable getopts
enable hash
enable help
enable history
enable jobs
enable kill
enable let
enable local
enable logout
enable mapfile
enable popd
enable printf
enable pushd
enable pwd
enable read
enable readarray
enable readonly
enable return
enable set
enable shift
enable shopt
enable source
enable suspend
enable test
enable times
enable trap
enable true
enable type
enable typeset
enable ulimit
enable umask
enable unalias
enable unset
enable wait

如果想要禁用指定的命令,可以使用enable -n command實現,例如禁用echo

一旦禁用了echo,再次使用type echo檢視命令的型別時顯示的是外部命令

[root@centos8 ~]# enable -n echo
[root@centos8 ~]# type echo
echo is /usr/bin/echo

此時再次使用echo執行的是外部命令

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

如果想要再次啟用內部命令echo,直接使用enable echo即可

[root@centos8 ~]# enable echo
[root@centos8 ~]# type -a echo
echo is a shell builtin
echo is /usr/bin/echo

在日常運維中絕大多數任務都是使用外部命令實現的,日常常用的外部命令大概有幾百個。。。

Linux系統的外部命令儲存在PATH變數的路徑下,可以使用echo $PATH 檢視PATH對應的路徑。

[root@centos8 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

當首次執行外部命令,從PATH的路徑下查詢外部命令,後續再次執行外部命令時,從記憶體中查詢。
如果想檢視記憶體中快取了哪些外部命令,可以使用hash命令檢視

[root@centos8 ~]# hash
hits	command
   2	/usr/bin/lsblk
   1	/usr/bin/echo
   1	/usr/bin/ls
   3	/usr/bin/clear

如果想要清除記憶體中的外部命令,可以使用hash -d command實現,除此以外可以使用hash -r 可以清除記憶體中全部的外部命令。

命令的別名機制

別名類似於小名,日常運維中有些常用的命令,例如free -h 命令,其功能是用於檢視記憶體

[root@centos8 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:          7.6Gi       851Mi       6.1Gi        10Mi       723Mi       6.5Gi
Swap:         4.0Gi          0B       4.0Gi

如果想要更快捷的達到同樣的功能,可以使用alias來定義別名,其使用方式是alias 別名='命令'

[root@centos8 ~]# alias free='free -h'
[root@centos8 ~]# free
              total        used        free      shared  buff/cache   available
Mem:          7.6Gi       879Mi       6.0Gi        10Mi       723Mi       6.5Gi
Swap:         4.0Gi          0B       4.0Gi

不過alias增加的命令也是臨時性的,如果想要永久生效,可以儲存在.bashrc檔案中

[root@centos8 ~]# echo "alias free='free -h' " >> .bashrc

修改完成後還需要執行. .bashrc讓修改的檔案立即生效

如果想要刪除別名,可以使用unalias命令實現

[root@centos8 ~]# unalias free
[root@centos8 ~]# free
              total        used        free      shared  buff/cache   available
Mem:        7972884      879116     6348600       11136      745168     6814948
Swap:       4194300           0     4194300

如果想要臨時使用原始命令,不使用別名,可以在命令前面加,例如\free

[root@centos8 ~]# \free
              total        used        free      shared  buff/cache   available
Mem:        7972884      880104     6347348       11136      745432     6813828
Swap:       4194300           0     4194300

定義別名osversion實現快速檢視作業系統的版本

[root@centos8 ~]# echo "alias osversion='cat /etc/redhat-release'" >> .bashrc
[root@centos8 ~]# . .bashrc
[root@centos8 ~]# osversion
CentOS Linux release 8.2.2004 (Core) 

檢視.bashrc檔案內容

別名、內部命令和外部命令的順序從高到低依次是別名>內部命令>外部命令

Linux命令格式

Linux命令由命令[選項][引數]三部分組成,選項和引數都是可選的

  • 選項用於啟用或者關閉命令的某個或者某些功能
    選項有短選項和長選項兩種,其中短選項由 -和字元組成,例如 ls -l,id -u,長選項由--和單片語成,例如ls --help,長選項更加直觀
  • 引數是命令作用的物件,例如檔名、使用者名稱等等。例如hostname ittimeline.net 就是修改主機名

需要注意的是

  • 命令的多個選項以及引數和命令之間使用空白字元分隔
  • 多個命令可以使用;符號隔開
  • 一個命令可以使用\分成多行,命令太長時使用,例如編譯Nginx
  • 取消和結束命令執行:Ctrl+c,Ctrl+d