Linux 命令的執行過程/Shell提示符/alias命令

     在 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~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章