QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3143|回复: 1

認識 BASH Shell zz

[复制链接]
发表于 2006-10-21 00:28:55 | 显示全部楼层 |阅读模式
zz:鳥哥的 Linux 私房菜
               
       
認識 BASH Shell


最近更新日期:2006/10/05

文字模式 (command line) 這種指令下達的方式,在 Linux 裡面,其實就相當於是 bash 的工具與介面! 因為 Linux 就是以 bash 為預設的 shell 的!那麼前幾章我們都已經很快樂的進行了很多的指令下達囉~ 所以說, bash shell
根本就不難吧~是啦!只要能夠熟悉的話,那麼確實他也不是這麼不可親近的一項工具啊~ 這個章節中,鳥哥會由變數談起,先講到環境變數的功能與修改的問題, 然後會繼續提到歷史指令的運用。接下來,就會談一下『資料流重導向』這個重要概念,
最後就是管線命令的利用啦!好好清一清腦門,準備用功去囉~ ^_^ 這個章節幾乎是所有 command line 與未來主機維護與管理的重要基礎,一定要好好仔細的閱讀喔!

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. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23884
大標題的圖示Bash shell
我們在前面的 什麼是 Linux 那個章節當中,提到了, 管理整個硬體的其實是核心 (kernel),那我們一般使用者 (user) 則是以 shell 來跟核心溝通~ 讓核心達到我們所想要達到的工作目的。那麼系統有多少 shell 可用呢? 為什麼我們要使用 bash 啊?!底下分別來談一談喔!

小標題的圖示什麼是 Shell?
這應該是個蠻有趣的話題:『什麼是 Shell ?』相信只要摸過電腦,對於作業系統 ( 不論是 Linux 、 Unix 或者是 Windows ) 有點概念的朋友們大多聽過這個名詞,因為只要有『作業系統』那麼就離不開 Shell 這個東西。不過,在討論 Shell
之前,我們先來瞭解一下電腦的運作狀況吧! 舉個例子來說:當你要電腦傳輸出來『音樂』的時候,你的電腦需要什麼東西呢?

   1. 當然就是需要你的硬體有『音效卡晶片』這個硬體配備,否則怎麼會有聲音;
   2. 作業系統的核心可以支援這個晶片組,當然還需要提供晶片的驅動程式囉;
   3. 需要使用者(就是你)輸入發生聲音的指令囉!

這就是基本的一個輸出聲音的需要的步驟!那麼也就是說,你必須要『輸入』一個指令之後, 『硬體』才會透過你下達的指令來工作!嘿嘿!那麼硬體如何知道你下達的指令呢?那就是 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 及 csh 為主要的兩個 shell 。OK!這麼多的 shell 我要使用哪一個啊?呵呵!使用 Linux 支援最廣泛的 bash 就好了!
不要想太多!另外,咦!為什麼我們系統上的 shell 要寫入 /etc/shells 這個檔案啊? 這是因為系統某些服務在運行過程中, 會去檢查使用者能夠使用的 shells ,而這些 shell 的查詢就是藉由 /etc/shells 這個檔案囉!

舉例來說,某些 FTP 網站會去檢查使用者的可用 shell ,而如果你不想要讓這些使用者使用 FTP 以外的主機資源時,可能會給予該使用者一些怪怪的 shell,讓使用者無法以其他服務登入主機。 這個時候,你就得將那些怪怪的 shell 寫到 /etc/shells 當中了。舉例來說,我們的
FC4 的 /etc/shells 裡頭就有個 /sbin/nologin 檔案的存在,這個就是我們說的怪怪的 shell 囉~

那麼,再想一想,我這個使用者什麼時候可以取得 shell 來工作呢?還有, 我這個使用者預設會取得哪一個 shell 啊?!還記得我們在 首次進入 Linux -- 以文字方式登入 那個章節當中提到的登入動作吧?當我登入的時候,系統就會給我一個 shell 讓我來工作了。
而這個登入取得的 shell 就記錄在 /etc/passwd 這個檔案內!這個檔案的內容是啥?

[root@linux ~]# cat /etc/passwd
root:0:0:root:/root:/bin/bash
bin:1:1:bin:/bin:/sbin/nologin
daemon:2:2:daemon:/sbin:/sbin/nologin
....(中間省略).....

如上所示,在每一行的最後一個資料,就是您登入後,可以取得的預設的 shell 啦! 那你也會看到, root 是 /bin/bash ,不過,系統帳號 bin 與 daemon 等等,就使用那個怪怪的 /sbin/nologin 囉~關於使用者這部分的內容,我們留在 帳號管理 時提供更多的說明。

小標題的圖示Bash shell 的功能
既然 /bin/bash 是 Linux 預設的 shell ,那麼總是得瞭解一下這個玩意兒吧! BASH 是怎麼一回事呢?這個 shell 是 GNU 計畫中重要的工具軟體之一,目前也是 GNU 作業系統中標準的 shell ,他主要相容於 sh ,並且依據一些使用者需求,而加強的 shell
版本,可以說目前幾乎所有的 Linux distribution 都是使用 bash 作為管理核心的主要 shell !因此,不論您使用的是那個 distribution ,你都難逃需要學習 bash 的宿命啦!那麼這個 shell 有什麼好處,幹嘛 Linux 要使用他作為預設的 shell 呢? BASH
主要的優點有底下幾個:

# 命令編修能力(類似 DOS 的 doskey 功能):
使用 bash 裡頭,個人認為相當棒的一個功能就是『他能記憶使用過的指令!』 這功能真的相當的棒!因為我只要在指令列按『上下鍵』就可以找到前一個輸入的指令!而在很多 distribution 裡頭,預設的指令記憶功能可以到達 1000 個!也就是說,
你曾經下達過的指令都被記錄下來了,記錄的檔案在你的家目錄內的 .bash_history !不過,需要留意的是, ~/.bash_history 記錄的是前一次登入以前所執行過的指令, 而至於這一次登入所執行的指令都被暫存在暫記憶體中,當您成功的登出系統後,該指令記憶才會記錄到
.bash_history 當中!

這有什麼功能呢?最大的好處就是可以『查詢曾經做過的舉動!』, 如此可以知道你的執行步驟,那麼就可以追蹤您曾下達的指令,以作為除錯的工具! 但如此一來也有個煩惱,就是如果被駭客入侵了,那麼他只要翻你曾經執行過的指令, 剛好你的指令又跟系統有關(例如直接輸入
MySQL 的密碼在指令列上面)那麼很容易就被破解你的 Linux 主機!所以,最好是將記錄的指令數目減小一點較好!

# 命令與檔案補全功能:
還記得我們在 首次進入 Linux 的熱門按鍵 一節當中提到的 [tab] 這個按鍵嗎?!這個按鍵的功能就是在 bash 裡頭才有的啦!常常在 bash 環境中使用 [tab] 是個很棒的習慣喔!因為至少可以讓你 1)少打很多字; 2)確定輸入的資料是正確的! 使用 [tab] 按鍵的時機依據 [tab]
接在指令後或參數後而有所不同。我們再複習一次:

    * [Tab] 接在一串指令的第一個字的後面,則為命令補全;
    * [Tab] 接在一串指令的第二個字以後時,則為『檔案補齊』!

所以說,如果我想要知道我的環境中,所有可以執行的指令有幾個? 就直接在 bash 的提示字元後面輸入兩個 [tab][tab] 就能夠輸出所有的可執行指令了。 那如果想要知道系統當中所有以 c 為開頭的指令呢?就按下 c[tab][tab] 就好啦! ^_^

是的!真的是很方便的功能,所以,有事沒事,在 bash shell 底下,多按幾次 [tab] 是一個不錯的習慣啦!

# 命令別名(alias)設定功能:
假如我需要知道這個目錄底下的所有檔案(包含隱藏檔)及所有的檔案屬性,那麼我就必須要下達 ls -al 這樣的指令列,唉!真麻煩,有沒有更快的取代方式?呵呵!就使用命令別名呀!例如我最喜歡直接以 lm 這個自訂的命令來取代上面的命令,也就是說, lm 會等於 ls -al
這樣的一個功能,嘿!那麼要如何作呢?就使用 alias 即可!你可以在指令列輸入 alias 就可以知道目前的命令別名有哪些了!也可以直接下達命令來設定別名呦:

      alias lm='ls -al'

# 工作控制(jobs)、前景背景控制:
這部分我們在之後的資源管理章節中會再提及! 使用前、背景的控制可以讓工作進行的更為順利!至於工作控制(jobs)的用途則更廣, 可以讓我們隨時將工作丟到背景中執行!而不怕不小心使用了 [Ctrl] + c
來停掉該程序!真是好樣的!此外,也可以在單一登入的環境中,達到多工的目的呢!

# Shell scripts 的強大功能:
在 DOS 年代還記得將一堆指令寫在一起的所謂的『批次檔』吧?在 Linux 底下的 shell scripts 則發揮的更為強大的功能,可以將您日常生活當中常需要下達的連續指令寫成一個檔案, 該檔案並且可以透過對談互動式的方式來進行主機的偵測工作!也可以藉由 shell
提供的環境變數及相關指令來進行設計,哇!整個設計下來幾乎就是一個小型的程式語言了!該 scripts 的功能真的是超乎我的想像之外!以前在 DOS 底下需要程式語言才能寫的東西,在 Linux 底下使用簡單的 shell scripts
就可以幫你達成了!真的厲害!!這部分我們在後續章節再來談!

# 萬用字元!
除了完整的字串之外, bash 還支援許多的萬用字元來幫助使用者查詢與指令下達。 舉例來說,想要知道 /usr/X11R6/bin 底下有多少以 xt 為開頭的檔案嗎?使用: ls -l /usr/X11R6/bin/xt* 就能夠知道囉~此外,還有其他可供利用的萬用字元, 這些都能夠加快使用者的操作呢!
小標題的圖示Bash shell 的內建命令: type
我們在首次進入 Linux 章節當中,提到關於 Linux 的線上說明文件 部分,也就是 man page 的內容,那麼 bash 有沒有什麼說明文件啊?開玩笑~ 這麼棒的東西怎麼可能沒有說明文件!請您在 shell 的環境下,直接輸入 man bash 瞧一瞧,
嘿嘿!不是蓋的吧!讓您看個幾天幾夜也無法看完的 bash 說明文件,可是很詳盡的資料啊! ^_^

不過,在這個 man bash 所出現的 man page 當中,不知道您是否有察覺到,咦! 怎麼這個說明文件裡面有其他的檔案說明啊?舉例來說,那個 cd 指令的說明就在這個 man page 內? 然後我直接輸入 man cd
時,怎麼出現的畫面中,最上方竟然出現一堆指令的介紹??這是怎麼回事? 為了方便 shell 的操作,其實 bash 已經『內建』了很多指令了,例如上面提到的 cd , 還有例如 umask 等等的指令,都是內建在 bash 當中的呢!

那我怎麼知道這個指令是來自於外部指令(指的是其他非 bash 套件所提供的指令) 或是內建在 bash 當中的呢? 嘿嘿!利用 type 這個指令來觀察即可!舉例來說:

[root@linux ~]# type [-tpa] name
參數:
    :不加任何參數時,則 type 會顯示出那個 name 是外部指令還是 bash 內建的指令!
-t  :當加入 -t 參數時,type 會將 name 以底下這些字眼顯示出他的意義:
      file    :表示為外部指令;
      alias   :表示該指令為命令別名所設定的名稱;
      builtin :表示該指令為 bash 內建的指令功能;
-p  :如果後面接的 name 為指令時,會顯示完整檔名(外部指令)或顯示為內建指令;
-a  :會將由 PATH 變數定義的路徑中,將所有含有 name 的指令都列出來,包含 alias
範例:
範例一:查詢一下 ls 這個指令是否為 bash 內建?
[root@linux ~]# type ls
ls is aliased to `ls --color=tty'
# 沒有加上任何參數,僅列出 ls 這個指令的最主要使用情況
[root@linux ~]# type -t ls
alias
# -t 參數則僅列出 ls 這個指令的最主要使用情況說明
[root@linux ~]# type -a ls
ls is aliased to `ls --color=tty'
ls is /bin/ls
# 利用所有方法找出來的 ls 相關資訊都會被列出來!

範例二:那麼 cd 呢?
[root@linux ~]# type cd
cd is a shell builtin

透過 type 這個指令的用途,我們可以知道每個指令是否為 bash 的內建指令。 此外,由於利用 type 搜尋後面的名稱時,如果後面接的名稱並不能以執行檔的狀態被找到, 那麼該名稱是不會被顯示出來的。舉例來說,您的 FC4 應該不會有 vbird 這個指令吧?! 輸入 type -p
vbird 看一下,果然沒有輸出任何資料!而如果您輸入的是 type -p touch 呢? 則會出現 /bin/touch !呵呵!所以,這個 type 也可以用來作為類似 which 指令的用途啦!找指令用的!

小標題的圖示指令的下達
我們在 首次進入 Linux 一節當中,已經提到過在 shell 環境下的指令下達方式,不過,因為這個部分實在很重要,所以,我們還是再次的提醒一次!

[root@linux ~]# command [-options] parameter1 parameter2 ...
                  指令     選項      參數(1)    參數(2)
說明:
0. 一行指�
发表于 2006-10-21 00:43:03 | 显示全部楼层
3n  要简体的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-5-6 17:16 , Processed in 0.101567 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表