1. Bash shell
1.1 什麼是 shell ?
1.2 系統的 shell 與 /etc/shells 功能
1.3 Bash shell 的功能
1.4 Bash shell 的內建命令: type
1.5 指令的下達
2. Shell 的變數功能
2.1 變數的取用與設定:echo, 變數設定規則, unset
2.2 變數的用途?
2.3 環境變數的功能: env, 一些重要的環境變數, set, export
2.4 語系檔案的變數 (locale)
2.5 變數的有效範圍:
2.6 變數鍵盤讀取、陣列與宣告: read, declare, array
2.7 與檔案系統及程序的限制關係: ulimit
2.8 其他額外變數功能
3. 命令別名與歷史命令:
3.1 命令別名設定: alias, unalias
3.2 歷史命令: history, HISTSIZE
4. Bash shell 使用環境:
4.1 絕對路徑與相對路徑
4.2 登錄訊息顯示資料: /etc/issue, /etc/motd
4.3 環境設定檔: bashrc, ~/.bashrc, ~/.profile, profile...,/etc/inputrc, source
4.4 終端機的環境設定: stty, set
4.5 萬用字元與特殊符號:
5. 資料流重導向 (redirecte)
5.1 何謂資料流重導向?
5.2 命令執行的判斷依據: ; , &&, ||
6. 管線命令 (pipe):
6.1 擷取命令: cut, grep
6.2 排序命令: sort, wc, uniq
6.3 雙向重導向: tee
6.4 字元轉換命令: tr, col, join, paste, expand
6.5 分割命令: split
6.6 參數代換: xargs
6.7 關於減號 - 的用途
7. 本章習題練習
8. 針對本文的建議:
--------------------------------------------------------------------------------
Bash shell
我們在前面的 什麼是 Linux 那個章節當中,提到了, 管理整個硬體的其實是核心 (kernel),那我們一般使用者 (user) 則是以 shell 來跟核心溝通~ 讓核心達到我們所想要達到的工作目的。那麼系統有多少 shell 可用呢? 為什麼我們要使用 bash 啊?!底下分別來談一談喔!
--------------------------------------------------------------------------------
什麼是 Shell?
這應該是個蠻有趣的話題:『什麼是 Shell ?』相信只要摸過電腦,對於作業系統 ( 不論是 Linux 、 Unix 或者是 Windows ) 有點概念的朋友們大多聽過這個名詞,因為只要有『作業系統』那麼就離不開 Shell 這個東西。不過,在討論 Shell 之前,我們先來瞭解一下電腦的運作狀況吧! 舉個例子來說:當你要電腦傳輸出來『音樂』的時候,你的電腦需要什麼東西呢?
當然就是需要你的硬體有『音效卡晶片』這個硬體配備,否則怎麼會有聲音;
作業系統的核心可以支援這個晶片組,當然還需要提供晶片的驅動程式囉;
需要使用者(就是你)輸入發生聲音的指令囉!
這就是基本的一個輸出聲音的需要的步驟!那麼也就是說,你必須要『輸入』一個指令之後, 『硬體』才會透過你下達的指令來工作!嘿嘿!那麼硬體如何知道你下達的指令呢?那就是 kernel (核心)的控制工作了!瞭解了嗎?沒錯!也就是說,我們必須要透過『 Shell 』將我們輸入的指令與 Kernel 溝通,好讓 Kernel 可以控制硬體來正確無誤的工作! 基本上,我們可以透過底下這兩張圖來說明一下:
圖一、硬體、核心與使用者的相關性圖示
圖二、硬體、核心與使用者的相關性圖示
基本上,替我們工作的是『硬體』,而控制硬體的是『核心』,再來,我們使用者乃是利用『Shell』控制一些 kernel 提供的 『工具 (Utility)』來操控硬體替我們正確的工作。再進一步來說,由於 kernel 聽不懂人類的語言,而人類也沒有辦法直接記得 kernel 的語言,所以兩者的溝通就得藉由 shell 來支援了!(其實早期的 DOS 的文字介面也是使用 shell 來溝通呀!那個 shell 的名稱就叫做 command.com ,還記得嗎? ^_^)
以字面上的意思來說, kernel 是『核心』的意思,而 Shell 是『殼』的意思,呵呵!也就是說, shell 是最外頭的咚咚!而 kernel 乃是最內層的的咚咚啦!核心是作業系統的最底層的東西! 這個核心裡頭包括了各種的支援硬體的工具!當然囉,如果你的硬體太新,而你的 kernel 並沒有支援的話,那麼很抱歉,你的 Shell 能力再怎麼強,也沒有辦法使硬體工作的! 這樣可以瞭解了嗎?呵呵!沒錯!使電腦主機工作的正是核心的任務,但是操作核心來替使用者工作的,卻是 shell 喔!因此,有時候你的 shell 搞了老半天,硬體卻不能工作的時候,請注意, 您的『核心』是否正確呢?阿!扯遠了!這是 kernel 章節才要說的東西。
我幹嘛要學習文字模式的 Shell 呢?
我們常常提到的 shell 其實是比較狹隘的定義,一般來說,在 Linux 裡頭,所謂的 shell 就是指 BASH 這個文字模式的 shell 囉。但是,廣義的 shell 也可以是 KDE 之類的圖形介面控制軟體呢! 因為他也可以幫我們與 kernel 進行溝通啊!不過,在鳥哥的 Linux 私房菜裡面, 如果沒有特別說明的話,那麼我們的 shell 指的是比較狹義的,也就是文字模式的 shell 喔!
另外,鳥哥常常聽到這個問題:『我幹嘛要學習 shell 呢? 不是已經有很多的工具可以提供我設定我的主機了?我為何要花這麼多時間去學指令呢?不是以 X Window 按一按幾個按鈕就可以搞定了嗎?為什麼要這麼麻煩?』唉~還是得一再地強調, X Window 還有 Web 介面的設定工具例如 webmin 是真的好用的傢伙, 他真的可以幫助我們很簡易的設定好我們的主機,甚至是一些很進階的設定都可以幫我們搞定。
但是鳥哥在序章裡面也已經提到過相當多次了, X Window 的介面雖然親善,功能雖然強大,而 web 介面的工具也可以提供我們很友善的服務,但是畢竟他是將所有利用到的套件都整合在一起的一個套件而已, 並非是一個完整的套件,所以某些時候當你升級或者是使用其他套件管理模組( 例如 tarball 而非 rpm 檔案等等 )時,就會造成設定的困擾了。
此外,遠端連線時,文字介面的傳輸速度一定比較快, 而且,較不容易出現斷線或者是資訊外流的問題,因此, shell 真的是得學習的一項工具。而且,他可以讓您更深入 Linux ,更瞭解他, 而不是只會按一按滑鼠而已!所謂『天助自助者!』多摸一點文字模式的東西,會讓你與 Linux 更親近呢!
有些朋友也很可愛,常會說:『我學這麼多幹什麼? 又不常用,也用不到!』嘿嘿!有沒有聽過『書到用時方恨少?』 當你的主機一切安然無恙的時候,您當然會覺得好像學這麼多的東西一點幫助也沒有呀! 萬一,某一天真的不幸給他中標了,您該如何是好?是直接重新安裝? 還是先追蹤入侵來源後進行漏洞的修補?或者是乾脆就關站好了?這當然涉及很多的考量, 但就以鳥哥的觀點來看,多學一點總是好的,尤其我們可以有備而無患嘛!甚至學的不精也沒有關係,瞭解概念也就 OK 啦!畢竟沒有人要您一定要背這麼多的內容啦!瞭解概念就很了不起了!
此外,如果您真的有心想要將您的主機管理的好,那麼良好的 shell 程式編寫是一定需要的啦!就鳥哥自己來說,我管理的主機雖然還不算多, 只有區區不到十部,但是如果每部主機都要花上幾十分鐘來查閱他的 log file 以及相關的資訊,那麼我可能會瘋掉!基本上,也太沒有效率了!這個時候,如果能夠藉由 shell 提供的命令重導向( 或稱資料流重導向 ),以及管線命令,呵呵!那麼我分析 log file 只要花費不到十分鐘就可以看完所有的主機之重要資訊了!相當的好用呢!
由於學習 shell 的好處真的是多多啦!所以,如果您是個系統管理員,或者有心想要管理系統的話,那麼 shell 這個東西與 shell scripts 這個東西,真的真的有必要看一看!
--------------------------------------------------------------------------------
系統的 shell 與 /etc/shells 功能
知道什麼是 Shell 之後,那麼我們來瞭解一下 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 的架構下發展出來的呦!
在介紹 shell 的優點之前,先來說一說 shell 的簡單歷史吧:第一個流行的 shell 是由 Steven Bourne 發展出來的,為了紀念他所以就稱為 Bourne shell ,或直接簡稱為 sh !而後來另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計依附於 BSD 版的 Unix 系統中的 shell ,這個 shell 的語法有點類似 C 語言,所以才得名為 C shell ,簡稱為 csh !由於在學術界 Sun 主機勢力相當的龐大,而 Sun 主要是 BSD 的分支之一,所以 C shell 也是另一個很重要而且流傳很廣的 shell 之一 ( 因為太多的程式設計師使用的就是 C 語言啦! )!(還記得我們在 Linux 是什麼那一章提到的吧? Sun 公司的創始人就是 Bill Joy,而 BSD 最早就是 Bill Joy 發展出來的啊!)。
那麼目前我們的 Linux (以 FC4 為例) 有多少我們可以使用的 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 的功能都差不多, 有的只是語法上面的不同而已。目前一般的使用者使用習慣上,似乎是以 bash %B
阅读(1189) | 评论(0) | 转发(0) |