Bash shell系列裡,由變數談起,先講到環境變數的功能與修改的問題, 然後會繼續提到曆史指令的運用。接下來,就會談一下『資料流重導向』這個重要概念, 最後就是管線命令的利用!
一 Bash shell簡介
管理整個硬體的其實是核心 (kernel),一般使用者 (user) 則是以 shell 來跟核心溝通~
我們常常提到的 shell 其實是比較狹隘的定義,一般來說,在 Linux 裡頭,所謂的 shell 就是指 BASH 這個文字模式的 shell 。但是,廣義的 shell 也可以是 KDE 之類的圖形介面控制軟體呢! 因為他也可以幫我們與 kernel 進行溝通。
那麼我們來瞭解一下 Linux 使用的是哪一個 shell 呢?檢查一下 /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 啊?!
還記得我們在 首次進入 Linux -- 以文字方式登入 那個章節當中提到的登入動作吧?當我登入的時候,系統就會給我一個 shell 讓我來工作了。 而這個登入取得的 shell 就記錄在 /etc/passwd 這個檔案內!這個檔案的內容是啥?
[root@linux ~]# 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
.....(中間省略).....
二 Bash shell 功能簡介
chap1 BASH 主要的優點有底下幾個:
1) 命令編修能力(類似 DOS 的 doskey 功能):
『記憶使用過的指令!』 指令列按『上下鍵』就可以找到前一個輸入的指令!記錄的檔案在你的家目錄的.bash_history ! ~/.bash_history 記錄的是前一次登入以前所執行過的指令, 這一次登入所執行的指令都被暫存在暫記憶體中,當您成功的登出系統後,該指令記憶才會記錄到 .bash_history 當中!
2) 命令與檔案補全功能:
[Tab] 接在一串指令的第一個字的後面,則為命令補全;
[Tab] 接在一串指令的第二個字以後時,則為『檔案補齊』!
如果我想要知道我的環境中,所有可以執行的指令有幾個? 就直接在 bash 的提示字元後面輸入兩個 [tab][tab] 就能夠輸出所有的可執行指令了。
3) 命令別名(alias)設定功能:
alias lm='ls -al'
4) 工作控制(jobs)、前景背景控制:
資源管理章節中會再提及
5) Shell scripts 的強大功能:
在 DOS 年代還記得將一堆指令寫在一起的所謂的『批次檔』吧?在 Linux 底下的 shell scripts 則發揮的更為強大的功能,可以將您日常生活當中常需要下達的連續指令寫成一個檔案, 該檔案並且可以透過對談互動方式來進行主機的偵測工作!整個設計下來幾乎就是一個小型的程式語言了!以前在 DOS 底下需要程式語言才能寫的東西,在 Linux 底下使用簡單的 shell scripts 就可以幫你達成了
6) 萬用字元!
舉例來說,想要知道 /usr/X11R6/bin 底下有多少以 xt 為開頭的檔案嗎?ls -l /usr/X11R6/bin/xt* 就能夠知道囉~此外,還有其它可供利用的萬用字元, 這些都能夠加快使用者的操作.
chap2 內建命令: type
為了方便 shell 的操作,其實 bash 已經『內建』了很多指令了,例如 cd , 還有例如 umask 等等的指令, 那我怎麼知道這個指令是來自於外部指令(指的是其它非 bash 套件所提供的指令) 或是內建在 bash 當中的呢:
[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