在 Linux 系統中“一切皆文件”,Linux 命令也不例外。那麼,當編輯完成 Linux 命令並回車後,系統底層是怎麼執行的?
1) 內核層
內核層是 UNIX/Linux 系統的核心和基礎,它直接附着在硬件平臺之上,控制和管理系統內各種資源(硬件資源和軟件資源),有效地組織進程的運行,從而擴展硬件的功能,提高資源的利用效率,爲用戶提供方便、高效、安全、可靠的應用環境。
2) Shell層
Shell 層是與用戶直接交互的界面。用戶可以在提示符下輸入命令行,由 Shell 解釋執行並輸出相應結果或者有關信息,所以我們也把 Shell 稱作命令解釋器,利用系統提供的豐富命令可以快捷而簡便地完成許多工作。
3) 應用層
應用層提供基於 X Window 協議的圖形環境。X Window 協議定義了一個系統所必須具備的功能(就如同 TCP/IP 是一個協議,定義軟件所應具備的功能),可系統能滿足此協議及符合 X 協會其他的規範,便可稱爲 X Window。
一、Linux 命令的執行過程
Linux 命令的執行過程可分爲 3 個步驟。
1、 用戶輸入命令
1) 判斷路徑
判斷用戶是否以絕對路徑或相對路徑的方式輸入命令(如 /bin/ls),如果是的話直接執行。
[root@centos7 ~]# ls /root
abc anaconda-ks.cfg test2
[root@centos7 ~]# /bin/ls /root
abc anaconda-ks.cfg test2
2) 檢查別名
Linux 系統會檢查用戶輸入的命令是否爲“別名命令”。
alias 命令:通過 alias 命令是可以給現有命令自定義別名的,即用一個自定義的命令名稱來替換原本的命令名稱。也可查看命令的別名。
[root@centos7 ~]# alias ls
alias ls='ls --color=auto'
[root@centos7 ~]# alias rm
alias rm='rm -i'
2、Linux命令行解釋器
Linux命令行解釋器(又稱爲 Shell)會判斷用戶輸入的命令是內部命令還是外部命令。Shell 會把命令解析成二進制格式,二進制命令進入系統內核,在內核中調用相關功能。其中,內部命令指的是解釋器內部的命令,會被直接執行;而用戶通常輸入的命令都是外部命令,這些命令交給步驟3繼續處理。
type 命令:可以判斷一個命令屬於內部命令還是外部命令
[root@centos7 ~]# type pwd
pwd is a shell builtin <-- pwd是內部命令
[root@centos7 ~]# type ls
ls is aliased to `ls --color=auto'
[root@centos7 ~]# type /bin/ls
/bin/ls is /bin/ls <-- ls是外部命令
[root@localhost ~]# type top
top is /usr/bin/top <-- top是外部命令
3、查找外部命令對應的可執行文件
當用戶執行的是外部命令時,系統會在指定的多個路徑中查找該命令的可執行文件,而定義這些路徑的變量,就稱爲 PATH 環境變量,其作用就是告訴 Shell 待執行命令的可執行文件可能存放的位置。
也就是說,Shell 會在 PATH 變量包含的多個路徑中逐個查找,直到找到爲止(如果找不到,Shell 會提供用戶“找不到此命令”)。
內部命令和外部命令的區別:
內部命令:內部命令由 Shell 自帶,會隨着系統啓動就會被調入內存,常住在內存中,可以直接從內存中讀取,所以執行效率很高
外部命令:外部命令僅是在系統中有對應的可執行文件,執行時需要讀取該文件。所以在用戶需要運行這些軟件的時候,才現從硬盤上把程序文件調入內存中,執行。
whereis命令:可查找可執行文件、源代碼文件、幫助文件在文件系統中的位置。這些文件的屬性應屬於原始代碼,二進制文件,或是幫助文件。whereis 程序還具有搜索源代碼、指定備用搜索路徑和搜索不尋常項的能力。
which 命令:在PATH變量指定的路徑中,搜索某個系統命令的位置,並且返回第一個搜索結果。也就是說,使用which命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令。
[root@centos7 ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
[root@centos7 ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
[root@centos7 ~]# whereis pwd
pwd: /usr/bin/pwd /usr/share/man/man1/pwd.1.gz
二、Linux系統終端提示符
Linux系統終端提示符的特徵由系統環境變量 PS1(Prompt String One)定義。
1、Shell提示符:
[用戶名@主機名 當前所在目錄]#/$
~ 表示當前用戶的家目錄
# 表示是root用戶登錄,管理員賬號登陸
$ 表示普通用戶登錄
Shell提示符中用到的基本轉義字符
序列 | 顯示值 |
---|---|
\a |
以ASCII格式編碼的鈴聲,當遇到這個轉移序列時,計算機會發出嗡嗡的響聲 |
\d |
以日,月,天格式來表示當前日期。例如,"Mon May 26" |
\h |
本地機的主機名,但不帶末尾的域名 |
\H |
完整的主機名 |
\j |
運行在當前shell會話中的工作數 |
\l |
當前終端設備名 |
\n |
一個換行符 |
\r |
一個回車符 |
\s |
shell程序名 |
\t |
以24小時制,hours:minutes:seconds的格式表示當前時間 |
\T |
以12小時製表示當前時間 |
\@ |
以12小時制,AM/PM格式來表示當前時間,例如"10:51 PM" |
\A |
以24小時制,hours:minutes 格式表示當前時間 |
\u |
當前用戶名 |
\v |
shell 程序的版本號,例如4.3 |
\V |
shell 程序的詳細版本號,例如4.3.11 |
\w |
當前工作目錄名 |
\W |
當前工作目錄名的最後部分 |
\! |
當前命令的歷史號 |
\# |
當前 shell 會話中的命令數 |
\$ |
這會顯示一個"$"字符,除非你擁有超級用戶權限。在那種情況下, 它會顯示一個"#"字符 |
\[ |
標誌着一系列一個或多個非打印字符的開始。這被用來嵌入非打印的控制字符,這些字符以某種方式來操作終端仿真器,比方說移動光標或者是更改文本顏色 |
\] |
標誌着非打印字符序列結束 |
2、通過改變變量PS1的值來改變提示符
PS1是一個bash的內建變量
通過命令 echo $PS1來查看當前設置
[root@centos7 ~]# echo $PS1
[\u@\h \W]\$
通過改變PS1變量來修改提示符的內容,修改瞭解下,平常用不着修改。
[root@centos7 ~]# PS1='[\u\A@\h \w]\$'
[root15:49@centos7 ~]#
上面只是臨時修改了Shell提示符,當我們打開新的終端窗口時,提示符又恢復到默認的了。
如果希望修改永久生效,我們可以通過更改~/.bashrc文件
3、查看shell的類型
1)查看當前發行版可以使用的所有shell類型
要查看當前系統中所有可登錄shell的類型,在/etc/shells配置文件中記錄了用戶可以登錄的shell的具體路徑,因此查看這個文件的內容,即可知道當前系統中所支持的所有shell類型。
[root@centos7 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
2)查看正在運行shell的類型
通過$0這個變量來獲取當前運行的shell類型。
[root@centos7 ~]# echo $0
-bash
[root@centos7 ~]# echo $SHELL
/bin/bash
3)查看某個用戶的Shell類型
不同的用戶使用不同的shell,這個取決於用戶的配置,該配置在文件:/etc/passwd查看。root用戶是使用bash這個shell。
[root@centos7 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
4、在Linux中,不同的文件類型對應的不同的顏色:
藍色:表示目錄
白色:表示普通文件
灰色:表示其它文件
綠色:表示可執行文件
淺藍色:鏈接文件
紅色:表示壓縮文件
黃色:表示設備文件,包括block,char,fifo
紅色閃爍:表示軟鏈接的文件有問題
用"dircolors -p"命令可以看到缺省的顏色設置,包括各種顏色和“粗體”,下劃線,閃爍等的定義。
三、alias命令設置指令的別名
用戶可利用alias,自定指令的別名。若僅輸入alias,則可列出目前所有的別名設置。alias的效力僅及於該次登入的操作。若要每次登入是即自動設好別名,可在.profile或.cshrc中設定指令的別名。
alias[別名]=[指令名稱]
參數說明:若不加任何參數,則列出目前所有的別名設置。
注意:
等號(=)前後不能有空格,否則就會出現語法錯誤了。
如果value中有空格或tab,則value一定要使用引號(單、雙引號都行)括起來。
1、如何查看別名
[root@centos7 ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@centos7 ~]# alias ll
alias ll='ls -l --color=auto'
2、添加臨時別名
[root@centos7 ~]# alias a_ll=ll
[root@centos7 ~]# alias
alias a_ll='ll'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@centos7 ~]# a_ll /root
總用量 4
drwxr-xr-x 3 root root 53 12月 12 14:37 abc
-rw-------. 1 root root 1440 12月 1 20:34 anaconda-ks.cfg
drwxr-xr-x 2 root root 6 12月 12 11:27 test2
3、刪除單個臨時別名
[root@centos7 ~]# unalias a_ll
如果想刪除所有的別名,直接使用 # unalias -a 命令即可,只不過要謹慎使用,避免你設置的所有的別名一下子都被清除了,自己還得一個一個重新設置回來。
alias的效力僅及於該次登入的操作,生成一個臨時的別名,重啓計算機,就失效了
reboot 命令用於用來重新啓動計算機。
4、如何執行命令本身而非別名
別名雖好,但也有它的弊端,比如定義的別名恰好和某個命令重名了,這就麻煩了,Shell 中執行的將永遠都是別名。
如果我們想執行真正的那個命令而非別名,可使用:
1)使用命令的絕對路徑。
2)在命令前使用反斜線(\)
[root@centos7 ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
[root@centos7 ~]# /usr/bin/ls /root
abc anaconda-ks.cfg test2
[root@centos7 ~]# \ls /root
abc anaconda-ks.cfg test2
5、如何讓別名永久有效
Linux一切皆是文件,別名永久有效的配置一定是保存在某個文件中,所以,如果想讓別名永久有效的話,就需要把所有的別名設置方案保存到($HOME)目錄下的 .alias 文件中(如果系統中沒有這個文件,你可以創建一個)然後在 .bashrc 文件中增加這樣一段代碼:
# Aliases
if [ -f ~/.alias ]; then
. ~/.alias
fi
在 .alias文件中添加一個編輯ens33文件的別名:alias viens33='vi /etc/sysconfig/network-scripts/ifcfg-ens33'
[root@centos7 ~]# touch .alias
[root@centos7 ~]# ll -a
總用量 32
dr-xr-x---. 4 root root 189 12月 19 16:04 .
dr-xr-xr-x. 17 root root 224 12月 1 20:33 ..
drwxr-xr-x 3 root root 53 12月 12 14:37 abc
-rw-r--r-- 1 root root 0 12月 19 16:04 .alias
-rw-------. 1 root root 1440 12月 1 20:34 anaconda-ks.cfg
-rw-------. 1 root root 4046 12月 19 15:53 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 12月 29 2013 .bashrc
-rw-r--r--. 1 root root 100 12月 29 2013 .cshrc
-rw------- 1 root root 51 12月 12 15:05 .lesshst
-rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc
drwxr-xr-x 2 root root 6 12月 12 11:27 test2
[root@centos7 ~]# vi /root/.alias
[root@centos7 ~]# vi /root/.bashrc
...
[root@centos7 ~]# source /root/.bashrc
注意:
1)修改了bashrc文件後,要用 source /root/.bashrc 命令重載入這個配置文件,然後別名纔會生效!
參考文章:source命令 :使Shell讀入指定的Shell程序文件並依次執行文件中的所有語句
2)這個 .alias 文件配置在目錄/root/.bashrc中,所以 .alias 文件中的別名只會對root用戶生效,換了個用戶,又會失效!
如果想讓別名對所有用戶都有效,就把這個 .alias文件放在/etc下的,然後在對應的全局別名配置文件( vi /etc/bashrc),配置內容和上面一致!
這樣設置後,無論怎樣重啓系統,都不會影響設置的別名啦。
站在前輩的肩膀上,每天進步一點點
ends~