高階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