第十一章、認識與學習 BASH
1. 認識 BASH 這個 Shell
咱們在
第一章 Linux 是什麼當中提到了: 管理整個計算機硬件的實際上是操做系統的核心 (kernel),這個核心是須要被保護的! 因此咱們通常使用者就只能透過 shell 來跟核心溝通,以讓核心達到咱們所想要達到的工做。 那麼系統有多少 shell 可用呢?爲何咱們要使用 bash 啊?底下分別來談一談喔!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.1 硬件、核心與 Shell
其實殼程序的功能只是提供用戶操做系統的一個接口,所以這個殼程序須要能夠呼叫其餘軟件纔好。 咱們在第五章到第十章提到過不少命令,包括 man, chmod, chown, vi, fdisk, mkfs 等等命令,這些命令都是獨立的應用程序, 可是咱們能夠透過殼程序 (就是命令列模式) 來操做這些應用程序,讓這些應用程序呼叫核心來運行所需的工做哩! 這樣對於殼程序是否有了必定的概念了?
也就是說,只要可以操做應用程序的接口都可以稱爲殼程序。狹義的殼程序指的是命令列方面的軟件,包括本章要介紹的 bash 等。 廣義的殼程序則包括圖形接口的軟件!由於圖形接口其實也可以操做各類應用程序來呼叫核心工做啊! 不過在本章中,咱們主要仍是在使用 bash 啦!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.2 爲什麼要學文字接口的 shell
1.文字接口的 shell:你們都同樣!
鳥哥在前面的章節裏面也已經提到過至關屢次了, X Window 與 web 接口的工具,他的接口雖然親善,功能雖然強大, 但畢竟他是將全部利用到的軟件都整合在一塊兒的一組應用程序而已, 並不是是一個完整的套件,因此某些時候當你升級或者是使用其餘套件管理模塊 (例如 tarball 而非 rpm 文件等等) 時,就會形成配置的困擾了。甚至不一樣的 distribution 所設計的 X window 接口也都不相同,這樣也形成學習方面的困擾。
文字接口的 shell 就不一樣了!幾乎各家 distributions 使用的 bash 都是同樣的!如此一來, 你就可以輕輕鬆鬆的轉換不一樣的 distributions ,就像武俠小說裏面提到的『一法通、萬法通!』
2.遠程管理:文字接口就是比較快!
3.Linux 的任督二脈: shell 是也!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.3 系統的合法 shell 與 /etc/shells 功能
咱們來了解一下 Linux 使用的是哪個 shell 呢?什麼!哪個?難道說 shell 不就是『一個 shell 嗎?』哈哈!那可不!因爲早年的 Unix 年代,發展者衆,因此因爲 shell 依據發展者的不一樣就有許多的版本,例如常聽到的
Bourne SHell (sh) 、在 Sun 裏頭默認的 C SHell、 商業上經常使用的 K SHell、, 還有 TCSH 等等,每一種 Shell 都各有其特色。至於 Linux 使用的這一種版本就稱爲『 Bourne Again SHell (簡稱 bash) 』,這個 Shell 是 Bourne Shell 的加強版本,也是基準於 GNU 的架構下發展出來的呦!
那麼目前咱們的 Linux (以 CentOS 5.x 爲例) 有多少咱們能夠使用的 shells 呢? 你能夠檢查一下 /etc/shells 這個文件,至少就有底下這幾個能夠用的 shells:
- /bin/sh (已經被 /bin/bash 所取代)
- /bin/bash (就是 Linux 默認的 shell)
- /bin/ksh (Kornshell 由 AT&T Bell lab. 發展出來的,兼容於 bash)
- /bin/tcsh (整合 C Shell ,提供更多的功能)
- /bin/csh (已經被 /bin/tcsh 所取代)
- /bin/zsh (基於 ksh 發展出來的,功能更強大的 shell)
雖然各家 shell 的功能都差很少,可是在某些語法的下達方面則有所不一樣,所以建議你仍是得要選擇某一種 shell 來熟悉一下較佳。 Linux 默認就是使用 bash ,因此最初你只要學會 bash 就很是了不得了! ^_^! 另外,咦!爲何咱們系統上合法的 shell 要寫入
/etc/shells 這個文件啊? 這是由於系統某些服務在運行過程當中,會去檢查使用者可以使用的 shells ,而這些 shell 的查詢就是藉由 /etc/shells 這個文件囉!
舉例來講,某些 FTP 網站會去檢查使用者的可用 shell ,而若是你不想要讓這些使用者使用 FTP 之外的主機資源時,可能會給予該使用者一些怪怪的 shell,讓使用者沒法以其餘服務登錄主機。 這個時候,你就得將那些怪怪的 shell 寫到 /etc/shells 當中了。舉例來講,咱們的 CentOS 5.x 的 /etc/shells 裏頭就有個 /sbin/nologin 文件的存在,這個就是咱們說的怪怪的 shell 囉~
那麼,再想想,我這個使用者何時能夠取得 shell 來工做呢?還有, 我這個使用者默認會取得哪個 shell 啊?還記得咱們在
第五章的在終端界面登錄linux小節當中提到的登錄動做吧? 當我登錄的時候,系統就會給我一個 shell 讓我來工做了。 而這個登錄取得的 shell 就記錄在
/etc/passwd 這個文件內!這個文件的內容是啥?
如上所示,在每一行的最後一個數據,就是你登錄後能夠取得的默認的 shell 啦!那你也會看到, root 是 /bin/bash ,不過,系統帳號 bin 與 daemon 等等,就使用那個怪怪的 /sbin/nologin 囉~關於使用者這部分的內容,咱們留在
第十四章的帳號管理時提供更多的說明。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.4 Bash shell 的功能
既然 /bin/bash 是 Linux 默認的 shell ,那麼老是得了解一下這個玩意兒吧!bash 是 GNU 計劃中重要的工具軟件之一,目前也是 Linux distributions 的標準 shell 。 bash 主要兼容於 sh ,而且依據一些使用者需求,而增強的 shell 版本。不論你使用的是那個 distribution ,你都難逃須要學習 bash 的宿命啦!那麼這個 shell 有什麼好處,幹嗎 Linux 要使用他做爲默認的 shell 呢? bash 主要的優勢有底下幾個:
1.命令編修能力 (history):
bash 的功能裏頭,鳥哥我的認爲至關棒的一個就是『他能記憶使用過的命令!』 這功能真的至關的棒!由於我只要在命令列按『上下鍵』就能夠找到前/後一個輸入的命令!而在不少 distribution 裏頭,默認的命令記憶功能能夠到達 1000 個!
在你的家目錄內的 .bash_history 啦! 不過,須要留意的是,
~/.bash_history 記錄的是前一次登錄之前所運行過的命令, 而至於這一次登錄所運行的命令都被緩存在內存中,當你成功的註銷系統後,該命令記憶纔會記錄到 .bash_history 當中
ls-a ~ 能夠找到bash_history 文件
2.命令與文件補全功能: ([tab] 按鍵的好處)
- [Tab] 接在一串命令的第一個字的後面,則爲命令補全;
- [Tab] 接在一串命令的第二個字之後時,則爲『文件補齊』
3.命令別名配置功能: (alias)
假如我須要知道這個目錄底下的全部文件 (包含隱藏檔) 及全部的文件屬性,那麼我就必需要下達『 ls -al 』這樣的命令串,唉!真麻煩,有沒有更快的取代方式?呵呵!就使用命令別名呀!例如鳥哥最喜歡直接以 lm 這個自定義的命令來取代上面的命令,也就是說, lm 會等於 ls -al 這樣的一個功能,嘿!那麼要如何做呢?就使用 alias 便可!你能夠在命令列輸入 alias 就能夠知道目前的命令別名有哪些了!也能夠直接下達命令來配置別名呦:
alias lm='ls -al'
4.工做控制、前景背景控制: (job control, foreground, background)
這部分咱們在
第十七章 Linux 過程控制中再說起! 使用前、背景的控制可讓工做進行的更爲順利!至於工做控制(jobs)的用途則更廣, 可讓咱們隨時將工做丟到背景中運行!而不怕不當心使用了 [Ctrl] + c 來停掉該程序!真是好樣的!此外,也能夠在單一登陸的環境中,達到多任務的目的呢
5.程序化腳本: (shell scripts)
6.通配符: (Wildcard)
要知道 /usr/bin 底下有多少以 X 爲開頭的文件嗎?使用:『 ls -l /usr/bin/X* 』就可以知道囉~此外,還有其餘可供利用的通配符, 這些都可以加快使用者的操做呢!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.5 Bash shell 的內建命令: type
在
第五章提到關於
Linux 的聯機幫助文件部分,也就是 man page 的內容,那麼 bash 有沒有什麼說明文件啊?在 shell 的環境下,直接輸入 man bash 瞧一瞧.
在這個 bash 的 man page 當中,不知道你是否有察覺到,咦! 怎麼這個說明文件裏面有其餘的文件說明啊?舉例來講,那個 cd 命令的說明就在這個 man page 內? 而後我直接輸入 man cd 時,怎麼出現的畫面中,最上方居然出現一堆命令的介紹?這是怎麼回事?
爲了方便 shell 的操做,其實 bash 已經『內建』了不少命令了,例如上面提到的 cd , 還有例如 umask 等等的命令,都是內建在 bash 當中的呢!
怎麼知道這個命令是來自於外部命令(指的是其餘非 bash 所提供的命令) 或是內建在 bash 當中的呢? 嘿嘿!利用 type 這個命令來觀察便可!舉例來講:
透過 type 這個命令咱們能夠知道每一個命令是否爲 bash 的內建命令。 此外,因爲利用 type 搜尋後面的名稱時,若是後面接的名稱並不能以運行檔的狀態被找到, 那麼該名稱是不會被顯示出來的。也就是說, type 主要在找出『運行檔』而不是通常文件檔名喔! 呵呵!因此,這個 type 也能夠用來做爲相似
which 命令的用途啦!找命令用的!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.6 命令的下達
咱們在
第五章的開始下達命令小節已經提到過在 shell 環境下的命令下達方法,若是你忘記了請回到第五章再去回憶一下!這裏不重複說明了。 鳥哥這裏僅就
反斜槓 (\) 來講明一下命令下達的方式囉!
1.上面這個命令用途是將三個文件複製到 /root 這個目錄下而已。不過,由於命令太長, 因而鳥哥就利用『 \[Enter] 』來將 [Enter] 這個按鍵『跳脫!』開來
2.須要特別留意, [Enter] 按鍵是緊接着反斜槓 (\) 的,二者中間沒有其餘字符。 由於 \ 僅跳脫『緊接着的下一個字符』而已!因此,萬一我寫成: 『 \ [Enter] 』,亦即 [Enter] 與反斜槓中間有一個空格時,則 \ 跳脫的是『空格鍵』而不是 [Enter] 按鍵!這個地方請再仔細的看一遍!很重要!
3.果順利跳脫 [Enter] 後,下一行最前面就會主動出現 > 的符號, 你能夠繼續輸入命令囉
2. Shell 的變量功能
變量是 bash 環境中很是重要的一個玩意兒,咱們知道 Linux 是多人多任務的環境,每一個人登錄系統都能取得一個 bash , 每一個人都可以使用 bash 下達 mail 這個命令來收受『本身』的郵件,問題是, bash 是如何得知你的郵件信箱是哪一個文件? 這就須要『變量』的幫助啦!
----------------------------------------------------------------------------------------------------------------------------------------------------------------
2.1 什麼是變量?
那麼,什麼是『變量』呢?簡單的說,就是讓某一個特定字符串表明不固定的內容就是了。舉個你們在國中都會學到的數學例子, 那就是:『 y = ax + b 』這東西,在等號左邊的(y)就是變量,在等號右邊的(ax+b)就是變量內容。 要注意的是,左邊是未知數,右邊是已知數喔! 講的更簡單一點,咱們能夠『用一個簡單的 "字眼" 來取代另外一個比較複雜或者是容易變更的數據』
1.變量的可變性與方便性
舉例來講,咱們每一個帳號的郵件信箱默認是以 MAIL 這個變量來進行存取的, 當 dmtsai 這個使用者登錄時,他便會取得 MAIL 這個變量,而這個變量的內容其實就是 /var/spool/mail/dmtsai, 那若是 vbird 登錄呢?他取得的 MAIL 這個變量的內容其實就是 /var/spool/mail/vbird 。
2.影響 bash 環境操做的變量
某些特定變量會影響到 bash 的環境喔!舉例來講,咱們前面已經提到過不少次的那個 PATH 變量! 你能不能在任何目錄下運行某個命令,與
PATH 這個變量有很大的關係。例如你下達 ls 這個命令時,系統就是透過 PATH 這個變量裏面的內容所記錄的路徑順序來搜尋命令的呢!若是在搜尋完 PATH 變量內的路徑還找不到 ls 這個命令時, 就會在屏幕上顯示『 command not found 』的錯誤信息了。
若是說的學理一點,那麼因爲在 Linux System 下面,全部的線程都是須要一個運行碼, 而就如同上面提到的,你『真正以 shell 來跟 Linux 溝通,是在正確的登錄 Linux 以後!』這個時候你就有一個 bash 的運行程序,也才能夠真正的經由 bash 來跟系統溝通囉!而在進入 shell 以前,也正如同上面提到的,因爲系統須要一些變量來提供他數據的存取 (或者是一些環境的配置參數值, 例如是否要顯示彩色等等的) ,
因此就有一些所謂的『環境變量』 須要來讀入系統中了!這些環境變量例如 PATH、HOME、MAIL、SHELL 等等,都是很重要的, 爲了區別與自定義變量的不一樣,環境變量一般以大寫字符來表示呢!
3.腳本程序設計 (shell script) 的好幫手
最後咱們就簡單的對『什麼是變量』做個簡單定義好了: 『變量就是以一組文字或符號等,來取代一些配置或者是一串保留的數據!』, 例如:我配置了『myname』就是『VBird』,因此當你讀取 myname 這個變量的時候,系統天然就會知道!哈!那就是 VBird 啦! 那麼如何『顯示變量』呢?這就須要使用到 echo 這個命令啦!
----------------------------------------------------------------------------------------------------------------------------------------------------------------
2.2 變量的取用與配置:echo, 變量配置守則, unset
你能夠利用 echo 這個命令來取用變量, 可是,變量在被取用時,前面必需要加上錢字號『
$ 』才行
1.變量的取用: echo
變量的取用就如同上面的範例,利用 echo 就可以讀出,只是須要在變量名稱前面加上 $ , 或者是以 ${變量} 的方式來取用均可以!
如
何『配置』或者是『修改』 某個變量的內容啊?很簡單啦!用『等號(=)』鏈接變量與他的內容就好啦!
2.變量的配置守則
1.變量與變量內容以一個等號『=』來連結,以下所示:
『myname=VBird』
2. 等號兩邊不能直接接空格符,以下所示爲錯誤:
『myname = VBird』或『myname=VBird Tsai』
3. 變量名稱只能是英文字母與數字,可是開頭字符不能是數字,以下爲錯誤:
『2myname=VBird』
4.變量內容如有空格符可以使用雙引號『"』或單引號『'』將變量內容結合起來,但
雙引號內的特殊字符如 $ 等,能夠保有本來的特性,以下所示:
『var="lang is $LANG"』則『echo $var』可得『lang is en_US』
單引號內的特殊字符則僅爲通常字符 (純文本),以下所示:
『var='lang is $LANG'』則『echo $var』可得『lang is $LANG』
5.可用跳脫字符『 \ 』將特殊符號(如 [Enter], $, \, 空格符, '等)變成通常字符;
6.在一串命令中,還須要藉由其餘的命令提供的信息,能夠使用反單引號『`命令`』或 『$(命令)』。特別注意,那個 ` 是鍵盤上方的數字鍵 1 左邊那個按鍵,而不是單引號! 例如想要取得核心版本的配置:
『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』
7.若該變量爲擴增變量內容時,則可用 "$變量名稱" 或 ${變量} 累加內容,以下所示:
『PATH="$PATH":/home/bin』
8. 若該變量須要在其餘子程序運行,則須要以 export 來使變量變成環境變量:
『export PATH』
9.一般大寫字符爲系統默認變量,自行配置變量能夠使用小寫字符,方便判斷 (純粹依照使用者興趣與嗜好) ;
10.取消變量的方法爲使用 unset :『unset 變量名稱』例如取消 myname 的配置:
『unset myname』
什麼是『子程序』呢?就是說,在我目前這個 shell 的狀況下,去激活另外一個新的 shell ,新的那個 shell 就是子程序啦!在通常的狀態下,
父程序的自定義變量是沒法在子程序內使用的。可是透過 export 將變量變成環境變量後,就可以在子程序底下應用了!很不賴吧!至於程序的相關概念, 咱們會在第十七章程序管理當中提到的喔!
每一個 Linux 都可以擁有多個核心版本,且幾乎 distribution 的核心版本都不相同。以 CentOS 5.3 (未升級前) 爲例,他的默認核心版本是 2.6.18-128.el5 ,因此核心模塊目錄在 /lib/modules/2.6.18-128.el5/kernel/ 內。 也因爲每一個 distributions 的這個值都不相同,可是咱們卻能夠利用
uname -r 這個命令先取得版本信息。因此囉,就能夠透過上面命令當中的內含命令 `uname -r` 先取得版本輸出到 cd ... 那個命令當中,就可以順利的進入目前核心的驅動程序所放置的目錄囉!很方便吧!
其實上面的命令能夠說是做了兩次動做,亦便是:
- 先進行反單引號內的動做『uname -r』並獲得核心版本爲 2.6.18-128.el5
- 將上述的結果帶入原命令,故得命令爲:『cd /lib/modules/2.6.18-128.el5/kernel/』
----------------------------------------------------------------------------------------------------------------------------------------------------------------
2.3 環境變量的功能: env 與常見環境變量說明, set, export
環境變量能夠幫咱們達到不少功能~包括家目錄的變換啊、提示字符的顯示啊、運行文件搜尋的路徑啊等等的, 還有不少不少啦!那麼,既然環境變量有那麼多的功能,問一下,目前個人 shell 環境中, 有多少默認的環境變量啊?咱們能夠利用兩個命令來查閱,分別是
env 與 export 呢!
1.用 env 觀察環境變量與常見環境變量說明
env 是 environment (環境) 的簡寫啊,上面的例子當中,是列出來全部的環境變量。固然,若是使用 export 也會是同樣的內容~ 只不過, export 還有其餘額外的功能就是
HOME
表明用戶的家目錄。還記得咱們能夠使用 cd ~ 去到本身的家目錄嗎?或者利用 cd 就能夠直接回到用戶家目錄了。那就是取用這個變量啦~ 有不少程序均可能會取用到這個變量的值!
SHELL
告知咱們,目前這個環境使用的 SHELL 是哪支程序? Linux 默認使用 /bin/bash 的啦!
HISTSIZE
這個與『歷史命令』有關,亦便是, 咱們曾經下達過的命令能夠被系統記錄下來,而記錄的『筆數』則是由這個值來配置的。
MAIL
當咱們使用 mail 這個命令在收信時,系統會去讀取的郵件信箱文件 (mailbox)。
PATH
就是運行文件搜尋的路徑啦~目錄與目錄中間以冒號(:)分隔, 因爲文件的搜尋是依序由 PATH 的變量內的目錄來查詢,因此,目錄的順序也是重要的喔。
LANG
這個重要!就是語系數據囉~不少信息都會用到他, 舉例來講,當咱們在啓動某些 perl 的程序語言文件時,他會主動的去分析語系數據文件, 若是發現有他沒法解析的編碼語系,可能會產生錯誤喔!通常來講,咱們中文編碼一般是
zh_TW.Big5 或者是 zh_TW.UTF-8,這兩個編碼恰恰不容易被解譯出來,因此,有的時候,可能須要修訂一下語系數據。 這部分咱們會在下個小節作介紹的!
RANDOM
這個玩意兒就是『隨機隨機數』的變量啦!目前大多數的 distributions 都會有隨機數生成器,那就是 /dev/random 這個文件。 咱們能夠透過這個隨機數文件相關的變量 ($RANDOM) 來隨機取得隨機數值喔。在 BASH 的環境下,這個 RANDOM 變量的內容,介於 0~32767 之間,因此,你只要 echo $RANDOM 時,系統就會主動的隨機取出一個介於 0~32767 的數值。萬一我想要使用 0~9 之間的數值呢?呵呵~利用 declare 宣告數值類型, 而後這樣作就能夠了
2.用 set 觀察全部變量 (含環境變量與自定義變量)
bash 可不僅有環境變量喔,還有一些與 bash 操做接口有關的變量,以及用戶本身定義的變量存在的。 那麼這些變量如何觀察呢?這個時候就得要使用 set 這個命令了。 set 除了環境變量以外, 還會將其餘在 bash 內的變量統統顯示出來哩!
通常來講,不管是否爲環境變量,只要跟咱們目前這個 shell 的操做接口有關的變量, 一般都會被配置爲大寫字符,也就是說,『基本上,在 Linux 默認的狀況中,使用{大寫的字母}來配置的變量通常爲系統內定須要的變量』
1.PS1:(提示字符的配置)
這是 PS1 (數字的 1 不是英文字母),這個東西就是咱們的『命令提示字符』喔! 當咱們每次按下 [Enter] 按鍵去運行某個命令後,最後要再次出現提示字符時, 就會主動去讀取這個變量值了。上頭 PS1 內顯示的是一些特殊符號,這些特殊符號能夠顯示不一樣的信息, 每一個 distributions 的 bash 默認的 PS1 變量內容可能有些許的差別,沒關係,『習慣你本身的習慣』就行了
- \d :可顯示出『星期 月 日』的日期格式,如:"Mon Feb 2"
- \H :完整的主機名。舉例來講,鳥哥的練習機爲『www.vbird.tsai』
- \h :僅取主機名在第一個小數點以前的名字,如鳥哥主機則爲『www』後面省略
- \t :顯示時間,爲 24 小時格式的『HH:MM:SS』
- \T :顯示時間,爲 12 小時格式的『HH:MM:SS』
- \A :顯示時間,爲 24 小時格式的『HH:MM』
- \@ :顯示時間,爲 12 小時格式的『am/pm』樣式
- \u :目前使用者的帳號名稱,如『root』;
- \v :BASH 的版本信息,如鳥哥的測試主板本爲 3.2.25(1),僅取『3.2』顯示
- \w :完整的工做目錄名稱,由根目錄寫起的目錄名稱。但家目錄會以 ~ 取代;
- \W :利用 basename 函數取得工做目錄名稱,因此僅會列出最後一個目錄名。
- \# :下達的第幾個命令。
- \$ :提示字符,若是是 root 時,提示字符爲 # ,不然就是 $ 囉~
讓咱們來看看 CentOS 默認的 PS1 內容吧:『[\u@\h \W]\$ 』,如今你知道那些反斜槓後的數據意義了吧? 要注意喔!那個反斜槓後的數據爲 PS1 的特殊功能,與 bash 的變量配置不要緊啦!不要搞混了喔! 那你如今知道爲什麼你的命令提示字符是:『 [root@www ~]# 』了吧?
例子:
[root@www /home/dmtsai 16:50 #12]#
那個 # 表明第 12 次下達的命令。那麼應該如何配置 PS1 呢?能夠這樣啊:
2. $:(關於本 shell 的 PID)
錢字號自己也是個變量喔!這個咚咚表明的是『目前這個 Shell 的線程代號』,亦便是所謂的 PID (Process ID)。 更多的程序觀念,咱們會在第四篇的時候說起。想要知道咱們的 shell 的 PID ,就能夠用:『 echo $$ 』便可!出現的數字就是你的 PID 號碼。
3. ?:(關於上個運行命令的回傳值)
什麼?問號也是一個特殊的變量?沒錯!在 bash 裏面這個變量可重要的很! 這個變量是:『上一個運行的命令所回傳的值』, 上面這句話的重點是『上一個命令』與『回傳值』兩個地方。當咱們運行某些命令時, 這些命令都會回傳一個運行後的代碼。通常來講,若是成功的運行該命令, 則會回傳一個 0 值,若是運行過程發生錯誤,就會回傳『錯誤代碼』纔對!通常就是以非爲 0 的數值來取代。 咱們以底下的例子來看看
4.OSTYPE, HOSTTYPE, MACHTYPE:(主機硬件與核心的等級)
目前我的計算機的 CPU 主要分爲 32/64 位,其中 32 位又可分爲 i386, i586, i686,而 64 位則稱爲 x86_64。 因爲不一樣等級的 CPU 命令集不太相同,所以你的軟件可能會針對某些 CPU 進行優化,以求取較佳的軟件性能。 因此軟件就有 i386, i686 及 x86_64 之分
要留意的是,較高階的硬件一般會向下兼容舊有的軟件,但較高階的軟件可能沒法在舊機器上面安裝! 咱們在
第三章就曾說明過, 這裏再強調一次,你能夠在 x86_64 的硬件上安裝 i386 的 Linux 操做系統,可是你沒法在 i686 的硬件上安裝 x86_64 的 Linux 操做系統!這點得要牢記在心!
3.export: 自定義變量轉成環境變量
談了 env 與 set 如今知道有所謂的環境變量與自定義變量,那麼這二者之間有啥差別呢?
其實這二者的差別在於『 該變量是否會被子程序所繼續引用』啦
當你登錄 Linux 並取得一個 bash 以後,你的 bash 就是一個獨立的程序,被稱爲 PID 的就是。 接下來你在這個 bash 底下所下達的任何命令都是由這個 bash 所衍生出來的,那些被下達的命令就被稱爲子程序了。 咱們能夠用底下的圖示來簡單的說明一下父程序與子程序的概念
如上所示,咱們在本來的 bash 底下運行另外一個 bash ,結果操做的環境接口會跑到第二個 bash 去(就是子程序), 那本來的 bash 就會在暫停的狀況 (睡着了,就是 sleep)。整個命令運行的環境是實線的部分!若要回到本來的 bash 去, 就只有將第二個 bash 結束掉 (下達 exit 或 logout) 才行。更多的程序概念咱們會在第四篇談及,這裏只要有這個概念便可。
子程序僅會繼承父程序的環境變量, 子程序不會繼承父程序的自定義變量
export 命令就頗有用啦!如你想要讓該變量內容繼續的在子程序中使用,那麼就請運行:
這東西用在『分享本身的變量配置給後來呼叫的文件或其餘程序』啦!
這很是實用於 shell script 當中喔! 若是僅下達 export 而沒有接變量時,那麼此時將會把全部的『環境變量』秀出來喔!例如:
那如何將環境變量轉成自定義變量呢?能夠使用本章後續介紹的
declare 呢!
----------------------------------------------------------------------------------------------------------------------------------------------------------------
2.4 影響顯示結果的語系變量 (locale)
還記得咱們在
第五章裏面提到的語系問題嗎? 就是當咱們使用 man command 的方式去查詢某個數據的說明文件時,該說明檔的內容可能會由於咱們使用的語系不一樣而產生亂碼。 另外,利用 ls 查詢文件的時間時,也可能會有亂碼出如今時間的部分。那個問題其實就是語系的問題啦。
目前大多數的 Linux distributions 已經都是支持日漸流行的萬國碼了,也都支持大部分的國家語系。 這有賴於
i18n (注4) 支持的幫助呢! 那麼咱們的 Linux 到底支持了多少的語系呢?這能夠由 locale 這個命令來查詢到喔!
基本上,你能夠逐一配置每一個與語系有關的變量數據,但事實上,若是其餘的語系變量都未配置, 且你有配置 LANG 或者是 LC_ALL 時,則其餘的語系變量就會被這兩個變量所取代! 這也是爲何咱們在 Linux 當中,一般說明僅配置 LANG 這個變量而已,由於他是最主要的配置變量! 好了,那麼你應該要以爲奇怪的是,爲何在 Linux 主機的終端機接口 (tty1 ~ tty6) 的環境下,若是配置『 LANG=zh_TW.big5 』這個配置值生效後,使用 man 或者其餘信息輸出時, 都會有一堆亂碼,尤爲是使用 ls -l 這個參數時?
由於在 Linux 主機的終端機接口環境下是沒法顯示像中文這麼複雜的編碼文字, 因此就會產生亂碼了。也就是如此,咱們纔會必需要在 tty1 ~ tty6 的環境下, 加裝一些中文化接口的軟件,纔可以看到中文啊!不過,若是你是在 MS Windows 主機以遠程聯機服務器的軟件聯機到主機的話,那麼,嘿嘿!其實文字接口確實是能夠看到中文的。 此時反而你得要在 LANG 配置中文編碼纔好呢!
Tips:
不管如何,若是發生一些亂碼的問題,那麼配置系統裏面保有的語系編碼, 例如: en_US 或 en_US.utf8 等等的配置,應該就 OK 的啦!好了,那麼系統默認支持多少種語系呢? 當咱們使用 locale 時,系統是列出目前 Linux 主機內保有的語系文件, 這些語系文件都放置在: /usr/lib/locale/ 這個目錄中
----------------------------------------------------------------------------------------------------------------------------------------------------------------
2.5 變量的有效範圍:
變量也有使用的『範圍』?沒錯啊~咱們在上頭的
export 命令說明中,就提到了這個概念了。若是在跑程序的時候,有父程序與子程序的不一樣程序關係時,
則『變量』能否被引用與 export 有關。被 export 後的變量,咱們能夠稱他爲『環境變量』! 環境變量能夠被子程序所引用,可是其餘的自定義變量內容就不會存在於子程序中。
在學理方面,爲何環境變量的數據能夠被子程序所引用呢?這是由於內存配置的關係!理論上是這樣的:
- 當啓動一個 shell,操做系統會分配一記憶區塊給 shell 使用,此內存內之變量可以讓子程序取用
- 若在父程序利用 export 功能,可讓自定義變量的內容寫到上述的記憶區塊當中(環境變量);
- 當加載另外一個 shell 時 (亦即啓動子程序,而離開本來的父程序了),子 shell 能夠將父 shell 的環境變量所在的記憶區塊導入本身的環境變量區塊當中。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
2.6 變量鍵盤讀取、數組與宣告: read, declare, array
咱們上面提到的變量配置功能,都是由命令列直接配置的,那麼,可不可讓用戶可以經由鍵盤輸入? 什麼意思呢?是否記得某些程序運行的過程中,會等待使用者輸入
"yes/no" 之類的信息啊? 在 bash 裏面也有相對應的功能喔!此外,咱們還能夠宣告這個變量的屬性, 例如:數組或者是數字等等的
1.read
要讀取來自鍵盤輸入的變量,就是用 read 這個命令了。這個命令最常被用在 shell script 的撰寫當中, 想要跟使用者對談?用這個命令就對了。關於 script 的寫法,咱們會在第十三章介紹,底下先來瞧一瞧 read 的相關語法吧!
read 以後不加任何參數,直接加上變量名稱,那麼底下就會主動出現一個空白行等待你的輸入(如範例一)。 若是加上 -t 後面接秒數,例如上面的範例二,那麼 30 秒以內沒有任何動做時, 該命令就會自動略過了~若是是加上 -p ,嘿嘿!在輸入的光標前就會有比較多能夠用的提示字符給咱們參考!
2.declare / typeset
declare 或 typeset 是同樣的功能,就是在『宣告變量的類型』。若是使用 declare 後面並無接任何參數,那麼 bash 就會主動的將全部的變量名稱與內容統統叫出來,就好像使用 set 同樣啦! 那麼 declare 還有什麼語法呢?看看先:
因爲在默認的狀況底下, bash 對於變量有幾個基本的定義:
- 變量類型默認爲『字符串』,因此若不指定變量類型,則 1+2 爲一個『字符串』而不是『計算式』。 因此上述第一個運行的結果纔會出現那個狀況的;
- bash 環境中的數值運算,默認最多僅能到達整數形態,因此 1/3 結果是 0;
如今你曉得爲啥你須要進行變量宣告了吧?
若是須要非字符串類型的變量,那就得要進行變量的宣告才行啦! 底下繼續來玩些其餘的 declare 功能
declare 也是個頗有用的功能~尤爲是當咱們須要使用到底下的數組功能時, 他也能夠幫咱們宣告數組的屬性喔!不過,老話一句,數組也是在 shell script 比較經常使用的啦! 比較有趣的是,
若是你不當心將變量配置爲『只讀』,一般得要註銷再登錄才能復原該變量的類型了! @_@
3.數組 (array) 變量類型
某些時候,咱們必須使用數組來宣告一些變量,這有什麼好處啊?在通常人的使用上, 果真是看不出來有什麼好處的!不過,若是您曾經寫過程序的話,那纔會比較瞭解數組的意義
數組的配置方式是:
var[index]=content
----------------------------------------------------------------------------------------------------------------------------------------------------------------
2.7 與文件系統及程序的限制關係: ulimit
想象一個情況:個人 Linux 主機裏面同時登錄了十我的,這十我的不知怎麼搞的, 同時開啓了 100 個文件,每一個文件的大小約 10MBytes ,請問一下, 個人 Linux 主機的內存要有多大才夠? 10*100*10 = 10000 MBytes = 10GBytes ... 老天爺,這樣,系統不掛點纔有鬼哩!爲了要預防這個狀況的發生,
因此咱們的 bash 是能夠『限制用戶的某些系統資源』的,包括能夠開啓的文件數量, 能夠使用的 CPU 時間,能夠使用的內存總量等等。如何配置?用 ulimit 吧!
還記得咱們在
第八章 Linux 磁盤文件系統裏面提到過,單一 filesystem 可以支持的單一文件大小與 block 的大小有關。例如 block size 爲 1024 byte 時,單一文件可達 16GB 的容量。可是,咱們能夠用 ulimit 來限制使用者能夠建立的文件大小喔! 利用 ulimit -f 就能夠來配置了!例如上面的範例二,要注意單位喔!單位是 Kbytes
Tips:
想要復原 ulimit 的配置最簡單的方法就是註銷再登錄,不然就是得要從新以 ulimit 配置才行! 不過,要注意的是,通常身份使用者若是以 ulimit 配置了 -f 的文件大小, 那麼他『只能繼續減少文件容量,不能添加文件容量喔!』另外,若想要管控使用者的 ulimit 限值, 能夠參考第十四章的 pam 的介紹
----------------------------------------------------------------------------------------------------------------------------------------------------------------
2.8 變量內容的刪除、取代與替換:, 刪除與取代, 測試與替換
變量除了能夠直接配置來修改本來的內容以外,有沒有辦法透過簡單的動做來將變量的內容進行微調呢? 舉例來講,進行變量內容的刪除、取代與替換等!是能夠的!
1.變量內容的刪除與取代
能夠用底下這張表格來講明:
很是有趣!不是嗎?由於在 PATH 這個變量的內容中,每一個目錄都是以冒號『:』隔開的, 因此要從頭刪除掉目錄就是介於斜線 (/) 到冒號 (:) 之間的數據!可是 PATH 中不止一個冒號 (:) 啊! 因此 # 與 ## 就分別表明:
- # :符合取代文字的『最短的』那一個;
- ##:符合取代文字的『最長的』那一個
上面談到的是『從前面開始刪除變量內容』,那麼若是想要『從後面向前刪除變量內容』呢? 這個時候就得使用百分比 (%) 符號了!來看看範例四怎麼作吧!
因爲我是想要由變量內容的後面向前面刪除,而我這個變量內容最後面的結尾是『/root/bin』, 因此你能夠看到上面我刪除的數據最終必定是『bin』,亦便是『:*bin』那個 * 表明通配符! 至於 % 與 %% 的意義其實與 # 及 ## 相似!這樣理解否?
瞭解了刪除功能後,接下來談談取代吧!繼續玩玩範例六囉!
咱們將這部份做個總結說明一下:
變量配置方式 |
說明 |
${變量#關鍵詞} ${變量##關鍵詞} |
若變量內容從頭開始的數據符合『關鍵詞』,則將符合的最短數據刪除 若變量內容從頭開始的數據符合『關鍵詞』,則將符合的最長數據刪除 |
${變量%關鍵詞} ${變量%%關鍵詞} |
若變量內容從尾向前的數據符合『關鍵詞』,則將符合的最短數據刪除 若變量內容從尾向前的數據符合『關鍵詞』,則將符合的最長數據刪除 |
${變量/舊字符串/新字符串} ${變量//舊字符串/新字符串} |
若變量內容符合『舊字符串』則『第一個舊字符串會被新字符串取代』 若變量內容符合『舊字符串』則『所有的舊字符串會被新字符串取代』 |
2.變量的測試與內容替換
在某些時刻
咱們經常須要『判斷』某個變量是否存在,若變量存在則使用既有的配置,若變量不存在則給予一個經常使用的配置。 咱們舉底下的例子來講明好了,看看能不能較容易被你所理解呢!
在上面的範例中,重點在於減號
『 - 』後面接的關鍵詞!基本上你能夠這樣理解:
不過這仍是有點問題!由於 username 可能已經被配置爲
『空字符串』了!果然如此的話,那你還能夠使用底下的範例來給予 username 的內容成爲 root 喔!
在大括號內有沒有冒號
『 : 』的差異是很大的!加上冒號後,被測試的變量未被配置或者是已被配置爲空字符串時, 都可以用後面的內容 (本例中是使用 root 爲內容) 來替換與配置!這樣能夠了解了嗎?除了這樣的測試以外, 還有其餘的測試方法喔!鳥哥將他整理以下:
Tips:
底下的例子當中,那個 var 與 str 爲變量,咱們想要針對 str 是否有配置來決定 var 的值喔! 通常來講, str: 表明『str 沒配置或爲空的字符串時』;至於 str 則僅爲『沒有該變量』。
根據上面這張表,咱們來進行幾個範例的練習吧! ^_^!首先讓咱們來測試一下,若是舊變量 (str) 不存在時, 咱們要給予新變量一個內容,若舊變量存在則新變量內容以舊變量來替換,結果以下:
關於減號 (-) 其實上面咱們談過了!這裏的測試只是要讓你更加了解,這個減號的測試並不會影響到舊變量的內容。 若是你想要將舊變量內容也一塊兒替換掉的話,那麼就使用等號 (=) 吧!
那若是我只是想知道,若是舊變量不存在時,整個測試就告知我『有錯誤』,此時就可以使用問號『 ? 』的幫忙啦! 底下這個測試練習一下先
基本上這種變量的測試也可以透過 shell script 內的 if...then... 來處理, 不過既然 bash 有提供這麼簡單的方法來測試變量,那咱們也能夠多學一些嘛! 不過這種變量測試一般是在程序設計當中比較容易出現,若是這裏看不懂就先略過,將來有用到判斷變量值時,再回來看看吧! ^_^
3. 命令別名與歷史命令
咱們知道在早期的 DOS 年代,清除屏幕上的信息能夠使用 cls 來清除,可是在 Linux 裏面, 咱們則是使用 clear 來清除畫面的。那麼能否讓 cls 等於 clear 呢?能夠啊!用啥方法? link file 仍是什麼的?別急!底下咱們介紹不用 link file 的命令別名來達成。那麼什麼又是歷史命令? 曾經作過的舉動咱們能夠將他記錄下來喔!那就是歷史命令
3.1 命令別名配置: alias, unalias
命令別名是一個頗有趣的東西,特別是你的慣用命令特別長的時候!還有, 增設默認的選項在一些慣用的命令上面,能夠預防一些不當心誤殺文件的狀況發生的時候! 舉個例子來講,若是你要查詢隱藏檔,而且須要長的列出與一頁一頁翻看,那麼須要下達『 ls -al | more 』這個命令,我是以爲很煩啦! 要輸入好幾個單字!那可不能夠使用 lm 來簡化呢?固然能夠,你能夠在命令行下面下達
馬上多出了一個能夠運行的命令喔!這個命令名稱爲 lm ,且其實他是運行 ls -al | more 啊!真是方便。不過, 要注意的是:『alias 的定義守則與
變量定義守則幾乎相同』, 因此你只要在 alias 後面加上你的 {『別名』='命令 選項...' }, 之後你只要輸入 lm 就至關於輸入了 ls -al|more 這一串命令
命令別名的配置還能夠取代既有的命令喔!舉例來講,咱們知道 root 能夠移除 (rm) 任何數據!因此當你以 root 的身份在進行工做時,須要特別當心, 可是總有失手的時候,那麼 rm 提供了一個選項來讓咱們確認是否要移除該文件,那就是 -i 這個選項!因此,你能夠這樣作
那麼之後使用 rm 的時候,就不用太擔憂會有錯誤刪除的狀況了!這也是命令別名的優勢囉!
那麼如何知道目前有哪些的命令別名呢?就使用 alias 呀!
那麼就使用 unalias 吧!例如要將剛剛的 lm 命令別名拿掉,就使用:
那麼命令別名與變量有什麼不一樣呢?命令別名是『新創一個新的命令, 你能夠直接下達該命令』的,至於變量則須要使用相似『 echo 』命令纔可以呼叫出變量的內容! 這二者固然不同!不少初學者在這裏總是搞不清楚!要注意啊! ^_^
--------------------------------------------------------------------------------------------------------------------------------------------------------------
3.2 歷史命令: history, HISTSIZE
1.使用
那麼如何查詢咱們曾經下達過的命令呢?就使用 history 囉!
在正常的狀況下,歷史命令的讀取與記錄是這樣的:
- 當咱們以 bash 登錄 Linux 主機以後,系統會主動的由家目錄的 ~/.bash_history 讀取之前曾經下過的命令,那麼 ~/.bash_history 會記錄幾筆數據呢?這就與你 bash 的 HISTFILESIZE 這個變量配置值有關了!
- 假設我此次登錄主機後,共下達過 100 次命令,『等我註銷時, 系統就會將 101~1100 這總共 1000 筆歷史命令升級到 ~/.bash_history 當中。』 也就是說,歷史命令在我註銷時,會將最近的 HISTFILESIZE 筆記錄到個人紀錄文件當中啦!
- 固然,也能夠用 history -w 強制馬上寫入的!那爲什麼用『升級』兩個字呢? 由於 ~/.bash_history 記錄的筆數永遠都是 HISTFILESIZE 那麼多,舊的信息會被主動的拿掉! 僅保留最新的!
那麼 history 這個歷史命令只可讓我查詢命令而已嗎?呵呵!固然不止啊!
若是我想要運行上一個命令, 除了使用上下鍵以外,我能夠直接以『 !! 』 來下達上個命令的內容,此外, 我也能夠直接選擇下達第 n 個命令,『 !n 』來運行,也能夠使用命令標頭,例如 『 !vi 』來運行最近命令開頭是 vi 的命令列!至關的方便而好用!
基本上 history 的用途很大的!可是須要當心安全的問題!尤爲是 root 的歷史紀錄文件,這是 Cracker 的最愛!由於不當心的 root 會將不少的重要數據在運行的過程當中會被紀錄在 ~/.bash_history 當中,若是這個文件被解析的話,後果不堪吶!不管如何,使用 history 配合『 ! 』曾經使用過的命令下達是頗有效率的一個命令下達方法!
2.同一帳號同時屢次登錄的 history 寫入問題
有些朋友在練習 linux 的時候喜歡同時開好幾個 bash 接口,這些 bash 的身份都是 root 。 這樣會有 ~/.bash_history 的寫入問題嗎?想想,由於這些 bash 在同時以 root 的身份登錄, 所以全部的 bash 都有本身的 1000 筆記錄在內存中。由於等到註銷時纔會升級記錄文件,因此囉, 最後註銷的那個 bash 纔會是最後寫入的數據。唔!如此一來其餘 bash 的命令操做就不會被記錄下來了
(其實有被記錄,只是被後來的最後一個 bash 所覆蓋升級了) 。
3.沒法記錄時間
歷史命令還有一個問題,那就是沒法記錄命令下達的時間。因爲這 1000 筆歷史命令是依序記錄的, 可是並無記錄時間,因此在查詢方面會有一些不方便。若是讀者們有興趣,其實能夠透過 ~/.bash_logout 來進行 history 的記錄,並加上 date 來添加時間參數,也是一個能夠應用的方向喔!
4. Bash shell 的操做環境
是否記得咱們登錄主機的時候,屏幕上頭會有一些說明文字,告知咱們的 Linux 版本啊什麼的, 還有,登錄的時候咱們還能夠給予用戶一些信息或者歡迎文字呢。此外, 咱們習慣的環境變量、命令別名等等的,是否能夠登錄就主動的幫我配置好? 這些都是須要注意的。另外,
這些配置值又能夠分爲系統總體配置值與各人喜愛配置值, 僅是一些文件放置的地點不一樣啦!
-----------------------------------------------------------------------------------------------------------------------------------------------------------
4.1 路徑與命令搜尋順序
咱們在
第六章與
第七章都曾談過『相對路徑與絕對路徑』的關係, 在本章的前幾小節也談到了 alias 與 bash 的內建命令。如今咱們知道系統裏面其實有很多的 ls 命令, 或者是包括內建的 echo 命令,那麼來想想,若是一個命令 (例如 ls) 被下達時, 究竟是哪個 ls 被拿來運行?頗有趣吧!
基本上,命令運行的順序能夠這樣看:
- 以相對/絕對路徑運行命令,例如『 /bin/ls 』或『 ./ls 』;
- 由 alias 找到該命令來運行;
- 由 bash 內建的 (builtin) 命令來運行;
- 透過 $PATH 這個變量的順序搜尋到的第一個命令來運行
舉例來講,你能夠下達 /bin/ls 及單純的 ls 看看,
會發現使用 ls 有顏色可是 /bin/ls 則沒有顏色。 由於 /bin/ls 是直接取用該命令來下達,而 ls 會由於『 alias ls='ls --color=tty' 』這個命令別名而先使用! 若是想要了解命令搜尋的順序,其實透過 type -a ls 也能夠查詢的到啦!上述的順序最好先了解喔!
-----------------------------------------------------------------------------------------------------------------------------------------------------------
4.2 bash 的進站與歡迎信息: /etc/issue, /etc/motd
什麼! bash 也有進站畫面與歡迎信息喔?真假?真的啊! 還記得在終端機接口 (tty1 ~ tty6) 登錄的時候,會有幾行提示的字符串嗎?那就是進站畫面啊! 那個字符串寫在哪裏啊?呵呵!在 /etc/issue 裏面啊!先來看看:
你要注意的是,除了
/etc/issue 以外還有個 /etc/issue.net 呢!這是啥?這個是提供給 telnet 這個遠程登陸程序用的。 當咱們使用 telnet 鏈接到主機時,主機的登錄畫面就會顯示 /etc/issue.net 而不是 /etc/issue 呢!
至於若是您想要讓使用者登錄後取得一些信息,例如您想要讓你們都知道的信息, 那麼能夠將信息加入 /etc/motd 裏面去!例如:當登錄後,告訴登錄者, 系統將會在某個固定時間進行維護工做,能夠這樣作
那麼當你的使用者(包括全部的通常帳號與 root)登錄主機後,就會顯示這樣的信息出來:
-----------------------------------------------------------------------------------------------------------------------------------------------------------
4.3 環境配置文件: login, non-login shell, /etc/profile, ~/.bash_profile, source, ~/.bashrc
你是否會以爲奇怪,怎麼咱們什麼動做都沒有進行,可是一進入 bash 就取得一堆有用的變量了? 這是由於系統有一些環境配置文件案的存在,讓 bash 在啓動時直接讀取這些配置文件,以規劃好 bash 的操做環境啦!
而這些配置文件又能夠分爲全體系統的配置文件以及用戶我的偏好配置文件。要注意的是, 咱們前幾個小節談到的命令別名啦、自定義的變量啦,在你註銷 bash 後就會失效,因此你想要保留你的配置, 就得要將這些配置寫入配置文件才行。
--------------------------------------------------------------------------
1.login 與 non-login shell
重點在於有沒有登錄 (login) 啦!
- login shell:取得 bash 時須要完整的登錄流程的,就稱爲 login shell。舉例來講,你要由 tty1 ~ tty6 登錄,須要輸入用戶的帳號與密碼,此時取得的 bash 就稱爲『 login shell 』囉;
- non-login shell:取得 bash 接口的方法不須要重複登錄的舉動,舉例來講,(1)你以 X window 登錄 Linux 後, 再以 X 的圖形化接口啓動終端機,此時那個終端接口並無須要再次的輸入帳號與密碼,那個 bash 的環境就稱爲 non-login shell了。(2)你在本來的 bash 環境下再次下達 bash 這個命令,一樣的也沒有輸入帳號密碼, 那第二個 bash (子程序) 也是 non-login shell 。
爲何要介紹 login, non-login shell 呢?這是由於這兩個取得 bash 的狀況中,讀取的配置文件數據並不同所致。
login shell 其實只會讀取這兩個配置文件:
- /etc/profile:這是系統總體的配置,你最好不要修改這個文件;
- ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:屬於使用者我的配置,你要改本身的數據,就寫入這裏
--------------------------------------------------------------------------
2./etc/profile (login shell 纔會讀)
你能夠使用 vim 去閱讀一下這個文件的內容。
這個配置文件能夠利用使用者的標識符 (UID) 來決定不少重要的變量數據, 這也是每一個使用者登錄取得 bash 時必定會讀取的配置文件! 因此若是你想要幫全部使用者配置總體環境,那就是改這裏囉!不過,沒事仍是不要隨便改這個文件喔 這個文件配置的變量主要有:
- PATH:會依據 UID 決定 PATH 變量要不要含有 sbin 的系統命令目錄;
- MAIL:依據帳號配置好使用者的 mailbox 到 /var/spool/mail/帳號名;
- USER:根據用戶的帳號配置此一變量內容;
- HOSTNAME:依據主機的 hostname 命令決定此一變量內容;
- HISTSIZE:歷史命令記錄筆數。CentOS 5.x 配置爲 1000 ;
etc/profile 可不止會作這些事而已,
他還會去呼叫外部的配置數據喔!在 CentOS 5.x 默認的狀況下, 底下這些數據會依序的被呼叫進來:
1. /etc/inputrc
其實這個文件並無被運行啦!/etc/profile 會主動的判斷使用者有沒有自定義輸入的按鍵功能,若是沒有的話, /etc/profile 就會決定配置『INPUTRC=/etc/inputrc』這個變量!此一文件內容爲 bash 的熱鍵啦、[tab]要不要有聲音啦等等的數據! 由於鳥哥以爲 bash 默認的環境已經很棒了,因此不建議修改這個文件!
2. /etc/profile.d/*.sh
其實這是個目錄內的衆多文件!
只要在 /etc/profile.d/ 這個目錄內且擴展名爲 .sh ,另外,使用者可以具備 r 的權限, 那麼該文件就會被 /etc/profile 呼叫進來。在 CentOS 5.x 中,這個目錄底下的文件規範了 bash 操做接口的顏色、 語系、ll 與 ls 命令的命令別名、vi 的命令別名、which 的命令別名等等。若是你須要幫全部使用者配置一些共享的命令別名時, 能夠在這個目錄底下自行建立擴展名爲 .sh 的文件,並將所須要的數據寫入便可喔!
3. /etc/sysconfig/i18n
決定 bash 默認使用何種語系的重要配置文件! 文件裏最重要的就是 LANG 這個變量的配置啦!咱們在前面的
locale 討論過這個文件囉! 自行回去瞧瞧先!
反正你只要記得,bash 的 login shell 狀況下所讀取的總體環境配置文件其實只有 /etc/profile,可是 /etc/profile 還會呼叫出其餘的配置文件
--------------------------------------------------------------------------
3.~/.bash_profile (login shell 纔會讀)
bash 在讀完了總體環境配置的 /etc/profile 並藉此呼叫其餘配置文件後,接下來則是會讀取使用者的
我的配置文件。 在 login shell 的 bash 環境中,所讀取的我的偏好配置文件其實主要有三個,依序分別是:
- ~/.bash_profile
- ~/.bash_login
- ~/.profile
其實 bash 的 login shell 配置只會讀取上面三個文件的其中一個, 而讀取的順序則是依照上面的順序。也就是說,若是 ~/.bash_profile 存在,那麼其餘兩個文件不論有無存在,都不會被讀取。 若是 ~/.bash_profile 不存在纔會去讀取 ~/.bash_login,而前二者都不存在纔會讀取 ~/.profile 的意思。 會有這麼多的文件,實際上是因應其餘 shell 轉換過來的使用者的習慣而已。
這個文件內有配置 PATH 這個變量喔!並且還使用了 export 將 PATH 變成環境變量呢!
因爲 PATH 在 /etc/profile 當中已經配置過,因此在這裏就以累加的方式添加用戶家目錄下的 ~/bin/ 爲額外的運行文件放置目錄。這也就是說,你能夠將本身建立的運行檔放置到你本身家目錄下的 ~/bin/ 目錄啦! 那就能夠直接運行該運行檔而不須要使用絕對/相對路徑來運行該文件
這個文件的內容比較有趣的地方在於 if ... then ... 那一段!那一段程序代碼咱們會在
第十三章 shell script 談到,假設你如今是看不懂的。 該段的內容指的是
『判斷家目錄下的 ~/.bashrc 存在否,若存在則讀入 ~/.bashrc 的配置』。 bash 配置文件的讀入方式比較有趣,主要是透過一個命令『 source 』來讀取的! 也就是說 ~/.bash_profile 其實會再呼叫 ~/.bashrc 的配置內容喔!最後,咱們來看看整個 login shell 的讀取流程:
實線的的方向是主線流程,虛線的方向則是被呼叫的配置文件!從上面咱們也能夠清楚的知道,在 CentOS 的 login shell 環境下,最終被讀取的配置文件是『
~/.bashrc 』這個文件喔!因此,你固然能夠將本身的偏好配置寫入該文件便可。 底下咱們還要討論一下 source 與 ~/.bashrc 喔!
--------------------------------------------------------------------------
4.source :讀入環境配置文件的命令
因爲 /etc/profile 與 ~/.bash_profile 都是在取得 login shell 的時候纔會讀取的配置文件,因此, 若是你將本身的偏好配置寫入上述的文件後,一般都是得註銷再登錄後,該配置纔會生效。那麼,能不能直接讀取配置文件而不註銷登錄呢? 能夠的!那就得要利用 source 這個命令了!
利用 source 或小數點 (.) 均可以將配置文件的內容讀進來目前的 shell 環境中! 舉例來講,我修改了 ~/.bashrc ,那麼不須要註銷,當即以 source ~/.bashrc 就能夠將剛剛最新配置的內容讀進來目前的環境中!很不錯吧!還有,包括 ~/bash_profile 以及 /etc/profile 的配置中, 不少時候也都是利用到這個 source (或小數點) 的功能喔!
--------------------------------------------------------------------------
5.~/.bashrc (non-login shell 會讀)
non-login shell 這種非登錄狀況取得 bash 操做接口的環境配置文件又是什麼?
當你取得 non-login shell 時,該 bash 配置文件僅會讀取 ~/.bashrc 而已啦!那麼默認的 ~/.bashrc 內容是
特別注意一下,因爲 root 的身份與通常使用者不一樣,鳥哥是以 root 的身份取得上述的數據, 若是是通常使用者的 ~/.bashrc 會有些許不一樣。看一下,你會發如今 root 的 ~/.bashrc 中其實已經規範了較爲保險的命令別名了。 此外,我們的 CentOS 5.x 還會主動的呼叫 /etc/bashrc 這個文件喔!爲何須要呼叫 /etc/bashrc 呢? 由於 /etc/bashrc 幫咱們的 bash 定義出底下的數據:
- 依據不一樣的 UID 規範出 umask 的值;
- 依據不一樣的 UID 規範出提示字符 (就是 PS1 變量);
- 呼叫 /etc/profile.d/*.sh 的配置
你要注意的是,這個 /etc/bashrc 是 CentOS 特有的 (實際上是 Red Hat 系統特有的),
--------------------------------------------------------------------------
6.其餘相關配置文件
1./etc/man.config
這的文件的內容『規範了使用
man 的時候, man page 的路徑到哪裏去尋找!』因此說的簡單一點,這個文件規定了下達 man 的時候,該去哪裏查看數據的路徑配置!
2.~/.bash_history
默認的狀況下, 咱們的歷史命令就記錄在這裏啊!而這個文件可以記錄幾筆數據,則與 HISTFILESIZE 這個變量有關啊。每次登錄 bash 後,bash 會先讀取這個文件,將全部的歷史命令讀入內存, 所以,當咱們登錄 bash 後就能夠查知上次使用過哪些命令囉。至於更多的歷史命令, 請自行回去參考喔!
3.~/.bash_logout
這個文件則記錄了『當我註銷 bash 後,系統再幫我作完什麼動做後才離開』的意思。 你能夠去讀取一下這個文件的內容,默認的狀況下,註銷時, bash 只是幫咱們清掉屏幕的信息而已。 不過,你也能夠將一些備份或者是其餘你認爲重要的工做寫在這個文件中 (例如清空緩存盤), 那麼當你離開 Linux 的時候,就能夠解決一些煩人的事情囉!
-----------------------------------------------------------------------------------------------------------------------------------------------------------
4.4 終端機的環境配置: stty, set
咱們在
第五章首次登錄 Linux 時就提過,能夠在 tty1 ~ tty6 這六個文字接口的終端機 (terminal) 環境中登錄,登錄的時候咱們能夠取得一些字符配置的功能喔! 舉例來講,
咱們能夠利用退格鍵 (backspace,就是那個←符號的按鍵) 來刪除命令行上的字符, 也能夠使用 [ctrl]+c 來強制終止一個命令的運行,當輸入錯誤時,就會有聲音跑出來警告。這是怎麼辦到的呢? 很簡單啊!由於登錄終端機的時候,會自動的取得一些終端機的輸入環境的配置啊
1.stty
那麼如何查閱目前的一些按鍵內容呢?能夠利用 stty (setting tty 終端機的意思) 呢! stty 也能夠幫助配置終端機的輸入按鍵表明意義喔!
咱們能夠利用 stty -a 來列出目前環境中全部的按鍵列表,在上頭的列表當中,須要注意的是特殊字體那幾個, 此外,若是出現 ^ 表示 [Ctrl] 那個按鍵的意思。舉例來講, intr = ^C 表示利用 [ctrl] + c 來達成的。幾個重要的表明意義是:
- eof : End of file 的意思,表明『結束輸入』。
- erase : 向後刪除字符,
- intr : 送出一個 interrupt (中斷) 的訊號給目前正在 run 的程序;
- kill : 刪除在目前命令列上的全部文字;
- quit : 送出一個 quit 的訊號給目前正在 run 的程序;
- start : 在某個程序中止後,從新啓動他的 output
- stop : 中止目前屏幕的輸出;
- susp : 送出一個 terminal stop 的訊號給正在 run 的程序。
記不記得咱們在
第五章講過幾個 Linux 熱鍵啊?沒錯! 就是這個 stty 配置值內的 intr / eof 囉~至於刪除字符,就是 erase 那個配置值啦! 若是你想要用 [ctrl]+h 來進行字符的刪除,那麼能夠下達:
那麼今後以後,你的刪除字符就得要使用 [ctrl]+h 囉,按下 [backspace] 則會出現 ^? 字樣呢! 若是想要回複利用 [backspace] ,就下達 stty erase ^? 便可啊! 至於更多的 stty 說明,記得參考一下 man stty 的內容喔!
2.set
除了 stty 以外,其實咱們的 bash 還有本身的一些終端機配置值呢!那就是利用 set 來配置的!
另外,其實咱們還有其餘的按鍵配置功能呢!就是在前一小節提到的 /etc/inputrc 這個文件裏面配置。
還有例如 /etc/DIR_COLORS* 與 /etc/termcap 等,也都是與終端機有關的環境配置文件案呢! 不過,事實上,鳥哥並不建議您修改 tty 的環境呢,這是由於 bash 的環境已經配置的很親和了, 咱們不須要額外的配置或者修改,不然反而會產生一些困擾。不過,寫在這裏的數據, 只是但願你們可以清楚的知道咱們的終端機是如何進行配置的喔! ^_^! 最後,咱們將 bash 默認的組合鍵給他彙整以下:
-----------------------------------------------------------------------------------------------------------------------------------------------------------
4.5 通配符與特殊符號
接下來讓咱們利用通配符來玩些東西吧!首先,利用通配符配合 ls 找檔名看看:
除了通配符以外,bash 環境中的特殊符號有哪些呢?底下咱們先彙整一下:
以上爲 bash 環境中常見的特殊符號彙整!理論上,你的『檔名』儘可能不要使用到上述的字符啦!
5. 數據流重導向 (Redirection)
數據流重導向 (redirect) 由字面上的意思來看,好像就是將『數據給他傳導到其餘地方去』的樣子? 沒錯~數據流重導向就是將某個命令運行後應該要出如今屏幕上的數據, 給他傳輸到其餘的地方,例如文件或者是裝置 (例如打印機之類的)!這玩意兒在 Linux 的文本模式底下可重要的! 尤爲是若是咱們想要將某些數據儲存下來時,就更有用了!
----------------------------------------------------------------------------------------------------------------------------------------------------------------
5.1 何謂數據流重導向?
通常來講,若是你要運行一個命令,一般他會是這樣的:
在上圖當中,
standard output 與 standard error output 分別表明『標準輸出』與『標準錯誤輸出』
--------------------------------------------------------------------
1.standard output 與 standard error output
標準輸出指的是『命令運行所回傳的正確的信息』,而標準錯誤輸出可理解爲『 命令運行失敗後,所回傳的錯誤信息』。
舉個簡單例子來講,咱們的系統默認有 /etc/crontab 但卻無 /etc/vbirdsay, 此時若下達『 cat /etc/crontab /etc/vbirdsay 』這個命令時,cat 會進行:
- 標準輸出:讀取 /etc/crontab 後,將該文件內容顯示到屏幕上;
- 標準錯誤輸出:由於沒法找到 /etc/vbirdsay,所以在屏幕上顯示錯誤信息
數據流重導向能夠將 standard output (簡稱 stdout) 與 standard error output (簡稱 stderr) 分別傳送到其餘的文件或裝置去,而分別傳送所用的特殊字符則以下所示:
- 標準輸入 (stdin) :代碼爲 0 ,使用 < 或 << ;
- 標準輸出 (stdout):代碼爲 1 ,使用 > 或 >> ;
- 標準錯誤輸出(stderr):代碼爲 2 ,使用 2> 或 2>> ;
怪了!屏幕怎麼會徹底沒有數據呢?這是由於本來『 ll / 』所顯示的數據已經被從新導向到 ~/rootfile 文件中了! 那個 ~/rootfile 的檔名能夠隨便你取。若是你下達『 cat ~/rootfile 』那就能夠看到本來應該在屏幕上面的數據囉。 若是我再次下達:『 ll /home > ~/rootfile 』後,那個 ~/rootfile 文件的內容變成什麼?
他將變成『僅有 ll /home 的數據』而已!咦!本來的『 ll / 』數據就不見了嗎?是的!由於該文件的建立方式是:
- 該文件 (本例中是 ~/rootfile) 若不存在,系統會自動的將他建立起來,可是
- 當這個文件存在的時候,那麼系統就會先將這個文件內容清空,而後再將數據寫入!
- 也就是若以 > 輸出到一個已存在的文件中,那個文件就會被覆蓋掉囉!
4.想要將數據累加而不想要將舊的數據刪除,那該如何是好?利用兩個大於的符號 (>>) 就好啦
當 (1) ~/rootfile 不存在時系統會主動建立這個文件;(2)若該文件已存在, 則數據會在該文件的最下方累加進去!
2.standard error output
若是是 standard error output 的錯誤數據呢?那就透過 2> 及 2>> 囉!一樣是覆蓋 (2>) 與累加 (2>>) 的特性!咱們在剛剛纔談到 stdout 代碼是 1 而 stderr 代碼是 2 , 因此這個 2> 是很容易理解的,
而若是僅存在 > 時,則表明默認的代碼 1 囉!也就是說:
- 1> :以覆蓋的方法將『正確的數據』輸出到指定的文件或裝置上;
- 1>>:以累加的方法將『正確的數據』輸出到指定的文件或裝置上;
- 2> :以覆蓋的方法將『錯誤的數據』輸出到指定的文件或裝置上;
- 2>>:以累加的方法將『錯誤的數據』輸出到指定的文件或裝置上;
若是想要將正確的與錯誤的數據分別存入不一樣的文件中須要怎麼作?
注意喔,此時『屏幕上不會出現任何信息』!由於剛剛運行的結果中,有 Permission 的那幾行錯誤信息都會跑到 list_error 這個文件中,至於正確的輸出數據則會存到 list_right 這個文件中囉!
3.standard input : < 與 <<
那就是『將本來須要由鍵盤輸入的數據,改由文件內容來取代』的意思
因爲加入 > 在 cat 後,因此那個 catfile 會被主動的建立,而內容就是剛剛鍵盤上面輸入的那兩行數據了。 唔!那我能不能用純文本文件取代鍵盤的輸入,也就是說,用某個文件的內容來取代鍵盤的敲擊呢? 能夠的!以下所示:
這東西很是的有幫助!尤爲是用在相似 mail 這種命令的使用上。 理解 < 以後,再來則是怪可怕一把的
<< 這個連續兩個小於的符號了。 他表明的是『結束的輸入字符』的意思!舉例來說:『我要用 cat 直接將輸入的信息輸出到 catfile 中, 且當由鍵盤輸入 eof 時,該次輸入就結束』,那我能夠這樣作:
看到了嗎?利用 << 右側的控制字符,咱們能夠終止一次輸入, 而沒必要輸入 [crtl]+d 來結束哩!這對程序寫做頗有幫助喔!好了,那麼爲什麼要使用命令輸出重導向呢?咱們來講一說吧!
- 屏幕輸出的信息很重要,並且咱們須要將他存下來的時候;
- 背景運行中的程序,不但願他干擾屏幕正常的輸出結果時;
- 一些系統的例行命令 (例如寫在 /etc/crontab 中的文件) 的運行結果,但願他能夠存下來時;
- 一些運行命令的可能已知錯誤信息時,想以『 2> /dev/null 』將他丟掉時;
- 錯誤信息與正確信息須要分別輸出時。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
5.2 命令運行的判斷依據:( ;) ,( &&), (||)
在某些狀況下,不少命令我想要一次輸入去運行,而不想要分次運行時,該如何是好?基本上你有兩個選擇, 一個是透過第十三章要介紹的
shell script 撰寫腳本去運行,一種則是透過底下的介紹來一次輸入多重命令喔!
1.cmd ; cmd (不考慮命令相關性的連續命令下達)
在某些時候,咱們但願能夠一次運行多個命令,例如在關機的時候我但願能夠先運行兩次 sync 同步化寫入磁盤後才 shutdown 計算機,那麼能夠怎麼做呢?這樣作呀:
在命令與命令中間利用分號 (;) 來隔開,這樣一來,分號前的命令運行完後就會馬上接着運行後面的命令了。
2.$? (命令回傳值) 與 && 或 ||
兩個命令之間有相依性,而這個相依性主要判斷的地方就在於前一個命令運行的結果是否正確。 還記得本章以前咱們曾介紹過
命令回傳值吧!嘿嘿!沒錯,您真聰明!就是透過這個回傳值啦! 再複習一次『
若前一個命令運行的結果爲正確,在 Linux 底下會回傳一個 $? = 0 的值』。 那麼咱們怎麼透過這個回傳值來判斷後續的命令是否要運行呢?這就得要藉由『 && 』及『 || 』的幫忙了! 注意喔,兩個 & 之間是沒有空格的!那個 | 則是 [Shift]+[\] 的按鍵結果。
(1)先判斷一個目錄是否存在; (2)若存在纔在該目錄底下建立一個文件。因爲咱們還沒有介紹如何判斷式 (
test) 的使用,在這裏咱們使用 ls 以及回傳值來判斷目錄是否存在啦! 讓咱們進行底下這個練習看看:
看到了吧?若是 /tmp/abc 不存在時,touch 就不會被運行,若 /tmp/abc 存在的話,那麼 touch 就會開始運行囉! 很不錯用吧!不過,咱們還得手動自行建立目錄,傷腦筋~能不能自動判斷,若是沒有該目錄就給予建立呢? 參考一下底下的例子先:
上面這個範例三老是會建立 /tmp/abc/hehe 的喔!不論 /tmp/abc 是否存在。那麼範例三應該如何解釋呢? 因爲Linux 底下的命令都是由左往右運行的,因此範例三有幾種結果咱們來分析一下:
- (1)若 /tmp/abc 不存在故回傳 $?≠0,則 (2)由於 || 遇到非爲 0 的 $? 故開始 mkdir /tmp/abc,因爲 mkdir /tmp/abc 會成功進行,因此回傳 $?=0 (3)由於 && 遇到 $?=0 故會運行 touch /tmp/abc/hehe,最終 hehe 就被建立了;
- (1)若 /tmp/abc 存在故回傳 $?=0,則 (2)由於 || 遇到 0 的 $? 不會進行,此時 $?=0 繼續向後傳,故 (3)由於 && 遇到 $?=0 就開始建立 /tmp/abc/hehe 了!最終 /tmp/abc/hehe 被建立起來。
整個流程圖示以下:
上面這張圖顯示的兩股數據中,上方的線段爲不存在 /tmp/abc 時所進行的命令行爲,下方的線段則是存在 /tmp/abc 所在的命令行爲。如上所述,下方線段因爲存在 /tmp/abc 因此致使 $?=0 ,讓中間的 mkdir 就不運行了! 並將 $?=0 繼續日後傳給後續的 touch 去利用啦!瞭乎?在任什麼時候刻你均可以拿上面這張圖做爲示意! 讓咱們來想一想底下這個例題吧!
6. 管線命令 (pipe)
就如同前面所說的, bash 命令運行的時候有輸出的數據會出現! 那麼若是這羣數據必須要通過幾道手續以後才能獲得咱們所想要的格式,應該如何來配置? 這就牽涉到管線命令的問題了
(pipe) ,管線命令使用的是『 | 』這個界定符號! 另外,管線命令與『連續下達命令』是不同的呦! 這點底下咱們會再說明。底下咱們先舉一個例子來講明一下簡單的管線命令。
假設咱們想要知道 /etc/ 底下有多少文件,那麼能夠利用 ls /etc 來查閱,不過, 由於 /etc 底下的文件太多,致使一口氣就將屏幕塞滿了~不知道前面輸出的內容是啥?此時,咱們能夠透過 less 命令的協助,
咱們就來了解一下這個管線命令『 | 』的用途吧! 其實這個管線命令『 | 』僅能處理經由前面一個命令傳來的正確信息,也就是 standard output 的信息,對於 stdandard error 並無直接處理的能力。
在每一個管線後面接的第一個數據一定是『命令』喔!並且這個命令必需要可以接受 standard input 的數據才行,這樣的命令才能夠是爲『管線命令』,例如
less, more, head, tail 等都是能夠接受 standard input 的管線命令啦。至於例如 ls, cp, mv 等就不是管線命令了!由於 ls, cp, mv 並不會接受來自 stdin 的數據。 也就是說,管線命令主要有兩個比較須要注意的地方:
- 管線命令僅會處理 standard output,對於 standard error output 會予以忽略
- 管線命令必需要可以接受來自前一個命令的數據成爲 standard input 繼續處理才行。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
6.1擷取命令: cut, grep
什麼是擷取命令啊?說穿了,就是將一段數據通過分析後,取出咱們所想要的。或者是經由分析關鍵詞,取得咱們所想要的那一行! 不過,要注意的是,通常來講,擷取信息一般是針對
『一行一行』來分析的, 並非整篇信息分析的喔~
---------------------------------------------------------------------------------
1.cut
cut 不就是『切』嗎?沒錯啦!這個命令能夠將一段信息的某一段給他『切』出來~ 處理的信息是以『行』爲單位喔!
cut 主要的用途在於將『同一行裏面的數據進行分解!』最常使用在分析一些數據或文字數據的時候! 這是由於有時候咱們會以某些字符看成分割的參數,而後來將數據加以切割,以取得咱們所須要的數據。 鳥哥也很常使用這個功能呢!尤爲是在分析 log 文件的時候!不過,cut 在處理多空格相連的數據時,可能會比較吃力一點。
------------------------------------------------------------------------
2.grep
剛剛的 cut 是將一行信息當中,取出某部分咱們想要的,而 grep 則是分析一行信息, 若當中有咱們所須要的信息,就將該行拿出來
grep 是個很棒的命令喔!他支持的語法實在是太多了~用在正規表示法裏頭, 可以處理的數據實在是多的很~不過,咱們這裏先不談正規表示法~下一章再來講明~ 您先了解一下, grep 能夠解析一行文字,取得關鍵詞,若該行有存在關鍵詞,就會整行列出來!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
6.2 排序命令: sort, uniq, wc
不少時候,咱們都會去計算一次數據裏頭的相同型態的數據總數,舉例來講, 使用 last 能夠查得這個月份有登錄主機者的身份。那麼我能夠針對每一個使用者查出他們的總登錄次數嗎? 此時就得要排序與計算之類的命令來輔助了!底下咱們介紹幾個好用的排序與統計命令喔!
1.sort
他能夠幫咱們進行排序,並且能夠依據不一樣的數據型態來排序喔! 例如數字與文字的排序就不同。此外,排序的字符與語系的編碼有關,所以, 若是您須要排序時,建議使用 LANG=C 來讓語系統一,數據排序比較好一些。
sort 一樣是很經常使用的命令呢!由於咱們經常須要比較一些信息啦! 舉個上面的第二個例子來講好了!今天假設你有不少的帳號,並且你想要知道最大的使用者 ID 目前到哪一號了!呵呵!使用 sort 一會兒就能夠知道答案咯!
2.uniq
想要將重複的數據僅列出一個顯示,能夠怎麼作呢?
這個命令用來將『重複的行刪除掉只顯示一個』,舉個例子來講, 你要知道這個月份登錄你主機的用戶有誰,而不在意他的登錄次數,那麼就使用上面的範例, (1)先將全部的數據列出;(2)再將人名獨立出來;(3)通過排序;(4)只顯示一個! 因爲這個命令是在將重複的東西減小,因此固然須要『配合排序過的文件』來處理囉!
3.wc
若是我想要知道 /etc/man.config 這個文件裏面有多少字?多少行?多少字符的話, 能夠怎麼作呢?其實能夠利用 wc 這個命令來達成喔!他能夠幫咱們計算輸出的信息的總體數據
wc 也能夠看成命令?這可不是上洗手間的 WC 呢!這是至關有用的計算文件內容的一個工具組喔!舉個例子來講, 當你要知道目前你的帳號文件中有多少個帳號時,就使用這個方法:『 cat /etc/passwd | wc -l 』啦!由於 /etc/passwd 裏頭一行表明一個使用者呀! 因此知道行數就曉得有多少的帳號在裏頭了!而若是要計算一個文件裏頭有多少個字符時,就使用 wc -m 這個選項吧!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
6.3 雙向重導向: tee
想個簡單的東西,咱們由前一節知道 > 會將數據流整個傳送給文件或裝置,所以咱們除非去讀取該文件或裝置, 不然就沒法繼續利用這個數據流。萬一我想要將這個數據流的處理過程當中將某段信息存下來,應該怎麼作? 利用 tee 就能夠囉
tee 會同時將數據流分送到文件去與屏幕 (screen);而輸出到屏幕的,其實就是 stdout ,可讓下個命令繼續處理喔!
tee 可讓 standard output 轉存一份到文件內並將一樣的數據繼續送到屏幕去處理! 這樣除了可讓咱們同時分析一份數據並記錄下來以外,還能夠做爲處理一份數據的中間緩存盤記錄之用! tee 這傢伙在不少選擇/填充的認證考試中很容易考呢!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
6.4 字符轉換命令: tr, col, join, paste, expand
咱們在
vim 程序編輯器當中,提到過 DOS 斷行字符與 Unix 斷行字符的不一樣,而且能夠使用 dos2unix 與 unix2dos 來完成轉換。好了,那麼思考一下,是否還有其餘經常使用的字符替代? 舉例來講,要將大寫改爲小寫,或者是將數據中的 [tab] 按鍵轉成空格鍵?還有,如何將兩篇信息整合成一篇? 底下咱們就來介紹一下這些字符轉換命令在管線當中的使用方法:
1.tr
tr 能夠用來刪除一段信息當中的文字,或者是進行文字信息的替換!
其實這個命令也能夠寫在『正規表示法』裏頭!由於他也是由正規表示法的方式來取代數據的! 以上面的例子來講,使用 [] 能夠配置一串字呢!也經常用來取代文件中的怪異符號! 例如上面第三個例子當中,能夠去除 DOS 文件留下來的 ^M 這個斷行的符號!這東西至關的有用!相信處理 Linux & Windows 系統中的人們最麻煩的一件事就是這個事情啦!亦便是 DOS 底下會自動的在每行行尾加入 ^M 這個斷行符號!這個時候咱們能夠使用這個 tr 來將 ^M 去除! ^M 能夠使用 \r 來代替之!
-----------------------------------------------------------------------------
2.col
雖然 col 有他特殊的用途,不過,不少時候,他能夠用來簡單的處理將 [tab] 按鍵取代成爲空格鍵! 例如上面的例子當中,若是使用 cat -A 則 [tab] 會以 ^I 來表示。 但通過 col -x 的處理,則會將 [tab] 取代成爲對等的空格鍵!此外, col 常常被利用於將 man page 轉存爲純文本文件以方便查閱的功能!如上述的範例二!
-----------------------------------------------------------------------------
3.join
join 看字面上的意義 (加入/參加) 就能夠知道,
他是在處理兩個文件之間的數據, 並且,主要是在處理『兩個文件當中,有 "相同數據" 的那一行,纔將他加在一塊兒』的意思。咱們利用底下的簡單例子來講明:
這個 join 在處理兩個相關的數據文件時,就真的是頗有幫助的啦! 例如上面的案例當中,個人 /etc/passwd, /etc/shadow, /etc/group 都是有相關性的, 其中 /etc/passwd, /etc/shadow 以帳號爲相關性,至於 /etc/passwd, /etc/group 則以所謂的 GID (帳號的數字定義) 來做爲他的相關性。根據這個相關性, 咱們能夠將有關係的數據放置在一塊兒!這在處理數據但是至關有幫助的! 可是上面的例子有點難,但願您能夠靜下心好好的看一看緣由喔!
此外,須要特別注意的是,在使用 join 以前,你所須要處理的文件應該要事先通過排序 (sort) 處理! 不然有些比對的項目會被略過呢!特別注意了!
-----------------------------------------------------------------------------
4.paste
這個 paste 就要比 join 簡單多了!相對於 join 必需要比對兩個文件的數據相關性, paste 就直接『將兩行貼在一塊兒,且中間以 [tab] 鍵隔開』而已!簡單的使用方法
-----------------------------------------------------------------------------
5.expand
這玩意兒就是在將 [tab] 按鍵轉成空格鍵啦~能夠這樣玩:
expand 也是挺好玩的~他會自動將 [tab] 轉成空格鍵~因此,以上面的例子來講, 使用 cat -A 就會查不到 ^I 的字符囉~此外,由於 [tab] 最大的功能就是格式排列整齊! 咱們轉成空格鍵後,這個空格鍵也會依據咱們本身的定義來添加大小~ 因此,並非一個 ^I 就會換成 8 個空白喔!這個地方要特別注意的哩! 此外,您也能夠參考一下 unexpand 這個將空白轉成 [tab] 的命令功能啊! ^_^
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
6.5 分割命令: split
若是你有文件太大,致使一些攜帶式裝置沒法複製的問題,嘿嘿!找 split 就對了! 他能夠幫你將一個大文件,依據文件大小或行數來分割,就能夠將大文件分割成爲小文件了! 快速又有效啊!真不錯~
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
6.6 參數代換: xargs
xargs 是在作什麼的呢?就以字面上的意義來看, x 是加減乘除的乘號,args 則是 arguments (參數) 的意思,因此說,這個玩意兒就是在
產生某個命令的參數的意思! xargs 能夠讀入 stdin 的數據,而且以空格符或斷行字符做爲分辨,將 stdin 的數據分隔成爲 arguments 。 由於是以空格符做爲分隔,因此,若是有一些檔名或者是其餘意義的名詞內含有空格符的時候, xargs 可能就會誤判了~他的用法其實也還滿簡單的!就來看一看先!
其實,在 man xargs 裏面就有三四個小范例,您能夠自行參考一下內容。 此外, xargs 真的是很好用的一個玩意兒!您真的須要好好的參詳參詳!會使用 xargs 的緣由是,
不少命令其實並不支持管線命令,所以咱們能夠透過 xargs 來提供該命令引用 standard input 之用!舉例來講,咱們使用以下的範例來講明:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
6.7 關於減號 - 的用途
管線命令在 bash 的連續的處理程序中是至關重要的!另外,在 log file 的分析當中也是至關重要的一環, 因此請特別留意!另外,在管線命令當中,經常會使用到前一個命令的
stdout 做爲此次的 stdin , 某些命令須要用到文件名 (例如 tar) 來進行處理時,該 stdin 與 stdout 能夠利用減號 "-" 來替代, 舉例來講:
上面這個例子是說:『我將 /home 裏面的文件給他打包,但打包的數據不是紀錄到文件,而是傳送到 stdout; 通過管線後,將 tar -cvf - /home 傳送給後面的 tar -xvf - 』。
後面的這個 - 則是取用前一個命令的 stdout, 所以,咱們就不須要使用 file 了!這是很常見的例子喔!注意注意!
7. 重點回顧
- 因爲核心在內存中是受保護的區塊,所以咱們必需要透過『 Shell 』將咱們輸入的命令與 Kernel 溝通,好讓 Kernel 能夠控制硬件來正確無誤的工做
- 學習 shell 的緣由主要有:文字接口的 shell 在各大 distribution 都同樣;遠程管理時文字接口速度較快; shell 是管理 Linux 系統很是重要的一環,由於 Linux 內不少控制都是以 shell 撰寫的。
- 系統合法的 shell 均寫在 /etc/shells 文件中;
- 用戶默認登錄取得的 shell 記錄於 /etc/passwd 的最後一個字段;
- bash 的功能主要有:命令編修能力;命令與文件補全功能;命令別名配置功能;工做控制、前景背景控制;程序化腳本;通配符
- type 能夠用來找到運行命令爲什麼種類型,亦可用於與 which 相同的功能;
- 變量就是以一組文字或符號等,來取代一些配置或者是一串保留的數據
- 變量主要有環境變量與自定義變量,或稱爲全局變量與局部變量
- 使用 env 與 export 可觀察環境變量,其中 export 能夠將自定義變量轉成環境變量;
- set 能夠觀察目前 bash 環境下的全部變量;
- $? 亦爲變量,是前一個命令運行完畢後的回傳值。在 Linux 回傳值爲 0 表明運行成功;
- locale 可用於觀察語系數據;
- 可用 read 讓用戶由鍵盤輸入變量的值
- ulimit 可用以限制用戶使用系統的資源狀況
- bash 的配置文件主要分爲 login shell 與 non-login shell。login shell 主要讀取 /etc/profile 與 ~/.bash_profile, non-login shell 則僅讀取 ~/.bashrc
- 通配符主要有: *, ?, [] 等等
- 數據流重導向透過 >, 2>, < 之類的符號將輸出的信息轉到其餘文件或裝置去;
- 連續命令的下達可透過 ; && || 等符號來處理
- 管線命令的重點是:『管線命令僅會處理 standard output,對於 standard error output 會予以忽略』 『管線命令必需要可以接受來自前一個命令的數據成爲 standard input 繼續處理才行。』
- 本章介紹的管線命令主要有:cut, grep, sort, wc, uniq, tee, tr, col, join, paste, expand, split, xargs 等。