## 10.4 Bash Shell 的操作環境:
是否記得我們登陸主機的時候,屏幕上頭會有一些說明文字,告知我們的 Linux 版本啊什么的, 還有,登陸的時候我們還可以給予使用者一些訊息或者歡迎文字呢。此外, 我們習慣的環境變量、命令別名等等的,是否可以登陸就主動的幫我設置好? 這些都是需要注意的。另外,這些設置值又可以分為系統整體設置值與各人喜好設置值, 僅是一些文件放置的地點不同啦!這我們后面也會來談一談的!
### 10.4.1 路徑與指令搜尋順序
我們在[第五章](../Text/index.html#dir_path)與[第六章](../Text/index.html#dir_pathway)都曾談過“相對路徑與絕對路徑”的關系, 在本章的前幾小節也談到了 alias 與 bash 的內置命令。現在我們知道系統里面其實有不少的 ls 指令, 或者是包括內置的 echo 指令,那么來想一想,如果一個指令 (例如 ls) 被下達時, 到底是哪一個 ls 被拿來運行?很有趣吧!基本上,指令運行的順序可以這樣看:
1. 以相對/絕對路徑執行指令,例如“ /bin/ls ”或“ ./ls ”;
2. 由 alias 找到該指令來執行;
3. 由 bash 內置的 (builtin) 指令來執行;
4. 通過 $PATH 這個變量的順序搜尋到的第一個指令來執行。
舉例來說,你可以下達 /bin/ls 及單純的 ls 看看,會發現使用 ls 有顏色但是 /bin/ls 則沒有顏色。 因為 /bin/ls 是直接取用該指令來下達,而 ls 會因為“ alias ls='ls --color=auto' ”這個命令別名而先使用! 如果想要了解指令搜尋的順序,其實通過 type -a ls 也可以查詢的到啦!上述的順序最好先了解喔!
例題:設置 echo 的命令別名成為 echo -n ,然后再觀察 echo 執行的順序答:
```
[dmtsai@study ~]$ alias echo='echo -n'
[dmtsai@study ~]$ type -a echo
echo is aliased to `echo -n'
echo is a shell builtin
echo is /usr/bin/echo
```
瞧!很清楚吧!先 alias 再 builtin 再由 $PATH 找到 /bin/echo 啰!
### 10.4.2 bash 的進站與歡迎訊息: /etc/issue, /etc/motd
蝦密! bash 也有進站畫面與歡迎訊息喔?真假?真的啊! 還記得在終端機接口 (tty1 ~ tty6) 登陸的時候,會有幾行提示的字串嗎?那就是進站畫面啊! 那個字串寫在哪里啊?呵呵!在 /etc/issue 里面啊!先來看看:
```
[dmtsai@study ~]$ cat /etc/issue
\S
Kernel \r on an \m
```
鳥哥是以完全未更新過的 CentOS 7.1 作為范例,里面默認有三行,較有趣的地方在于 \r 與 \m。 就如同 $PS1 這變量一樣,issue 這個文件的內容也是可以使用反斜線作為變量取用喔!你可以 man issue 配合 man agetty 得到下面的結果:
| issue 內的各代碼意義 |
| --- | --- | --- |
| \d 本地端時間的日期; |
| \l 顯示第幾個終端機接口; |
| \m 顯示硬件的等級 (i386/i486/i586/i686...); |
| \n 顯示主機的網絡名稱; |
| \O 顯示 domain name; |
| \r 操作系統的版本 (相當于 uname -r) |
| \t 顯示本地端時間的時間; |
| \S 操作系統的名稱; |
| \v 操作系統的版本。 |
做一下下面這個練習,看看能不能取得你要的進站畫面?
例題:如果你在 tty3 的進站畫面看到如下顯示,該如何設置才能得到如下畫面?
> CentOS Linux 7 (Core) (terminal: tty3)
> Date: 2015-07-08 17:29:19
> Kernel 3.10.0-229.el7.x86_64 on an x86_64
> Welcome!
注意,tty3 在不同的 tty 有不同顯示,日期則是再按下 [enter] 后就會所有不同。答:很簡單,用 root 的身份,并參考上述的反斜線功能去修改 /etc/issue 成為如下模樣即可(共五行):
```
\S (terminal: \l)
Date: \d \t
Kernel \r on an \m
Welcome!
```
曾有鳥哥的學生在這個 /etc/issue 內修改數據,光是利用簡單的英文字母作出屬于他自己的進站畫面, 畫面里面有他的中文名字呢!非常厲害!也有學生做成類似很大一個“囧”在進站畫面,都非常有趣!
你要注意的是,除了 /etc/issue 之外還有個 /etc/issue.net 呢!這是啥?這個是提供給 telnet 這個遠端登陸程序用的。 當我們使用 telnet 連接到主機時,主機的登陸畫面就會顯示 /etc/issue.net 而不是 /etc/issue 呢!
至于如果您想要讓使用者登陸后取得一些訊息,例如您想要讓大家都知道的訊息, 那么可以將訊息加入 /etc/motd 里面去!例如:當登陸后,告訴登陸者, 系統將會在某個固定時間進行維護工作,可以這樣做 (一定要用 root 的身份才能修改喔!):
```
[root@study ~]# vim /etc/motd
Hello everyone,
Our server will be maintained at 2015/07/10 0:00 ~ 24:00.
Please don't login server at that time. ^_^
```
那么當你的使用者(包括所有的一般帳號與 root)登陸主機后,就會顯示這樣的訊息出來:
```
Last login: Wed Jul 8 23:22:25 2015 from 127.0.0.1
Hello everyone,
Our server will be maintained at 2015/07/10 0:00 ~ 24:00.
Please don't login server at that time. ^_^
```
### 10.4.3 bash 的環境配置文件
你是否會覺得奇怪,怎么我們什么動作都沒有進行,但是一進入 bash 就取得一堆有用的變量了? 這是因為系統有一些環境設置文件的存在,讓 bash 在啟動時直接讀取這些配置文件,以規劃好 bash 的操作環境啦! 而這些配置文件又可以分為全體系統的配置文件以及使用者個人偏好配置文件。要注意的是, 我們前幾個小節談到的命令別名啦、自訂的變量啦,在你登出 bash 后就會失效,所以你想要保留你的設置, 就得要將這些設置寫入配置文件才行。下面就讓我們來聊聊吧!
* login 與 non-login shell
在開始介紹 bash 的配置文件前,我們一定要先知道的就是 login shell 與 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 會讀取哪些配置文件?一般來說,login shell 其實只會讀取這兩個配置文件:
1. /etc/profile:這是系統整體的設置,你最好不要修改這個文件;
2. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:屬于使用者個人設置,你要改自己的數據,就寫入這里!
那么,就讓我們來聊一聊這兩個文件吧!這兩個文件的內容可是非常繁復的喔!
* /etc/profile (login shell 才會讀)
你可以使用 vim 去閱讀一下這個文件的內容。這個配置文件可以利用使用者的識別碼 (UID) 來決定很多重要的變量數據, 這也是每個使用者登陸取得 bash 時一定會讀取的配置文件! 所以如果你想要幫所有使用者設置整體環境,那就是改這里啰!不過,沒事還是不要隨便改這個文件喔 這個文件設置的變量主要有:
* PATH:會依據 UID 決定 PATH 變量要不要含有 sbin 的系統指令目錄;
* MAIL:依據帳號設置好使用者的 mailbox 到 /var/spool/mail/帳號名;
* USER:根據使用者的帳號設置此一變量內容;
* HOSTNAME:依據主機的 hostname 指令決定此一變量內容;
* HISTSIZE:歷史命令記錄筆數。CentOS 7.x 設置為 1000 ;
* umask:包括 root 默認為 022 而一般用戶為 002 等!
/etc/profile 可不止會做這些事而已,他還會去調用外部的設置數據喔!在 CentOS 7.x 默認的情況下,下面這些數據會依序的被調用進來:
* /etc/profile.d/*.sh
其實這是個目錄內的眾多文件!只要在 /etc/profile.d/ 這個目錄內且擴展名為 .sh ,另外,使用者能夠具有 r 的權限, 那么該文件就會被 /etc/profile 調用進來。在 CentOS 7.x 中,這個目錄下面的文件規范了 bash 操作接口的顏色、 語系、ll 與 ls 指令的命令別名、vi 的命令別名、which 的命令別名等等。如果你需要幫所有使用者設置一些共享的命令別名時, 可以在這個目錄下面自行創建擴展名為 .sh 的文件,并將所需要的數據寫入即可喔!
* /etc/locale.conf
這個文件是由 /etc/profile.d/lang.sh 調用進來的!這也是我們決定 bash 默認使用何種語系的重要配置文件! 文件里最重要的就是 LANG/LC_ALL 這些個變量的設置啦!我們在前面的 [locale](../Text/index.html#variable_locale) 討論過這個文件啰! 自行回去瞧瞧先!
* /usr/share/bash-completion/completions/*
記得我們上頭談過 [tab] 的妙用吧?除了命令補齊、文件名補齊之外,還可以進行指令的選項/參數補齊功能!那就是從這個目錄里面找到相對應的指令來處理的! 其實這個目錄下面的內容是由 /etc/profile.d/bash_completion.sh 這個文件載入的啦!
反正你只要記得,bash 的 login shell 情況下所讀取的整體環境配置文件其實只有 /etc/profile,但是 /etc/profile 還會調用出其他的配置文件,所以讓我們的 bash 操作接口變的非常的友善啦! 接下來,讓我們來瞧瞧,那么個人偏好的配置文件又是怎么回事?
* ~/.bash_profile (login shell 才會讀)
bash 在讀完了整體環境設置的 /etc/profile 并借此調用其他配置文件后,接下來則是會讀取使用者的個人配置文件。 在 login shell 的 bash 環境中,所讀取的個人偏好配置文件其實主要有三個,依序分別是:
1. ~/.bash_profile
2. ~/.bash_login
3. ~/.profile
其實 bash 的 login shell 設置只會讀取上面三個文件的其中一個, 而讀取的順序則是依照上面的順序。也就是說,如果 ~/.bash_profile 存在,那么其他兩個文件不論有無存在,都不會被讀取。 如果 ~/.bash_profile 不存在才會去讀取 ~/.bash_login,而前兩者都不存在才會讀取 ~/.profile 的意思。 會有這么多的文件,其實是因應其他 shell 轉換過來的使用者的習慣而已。 先讓我們來看一下 dmtsai 的 /home/dmtsai/.bash_profile 的內容是怎樣呢?
```
[dmtsai@study ~]$ cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then <==下面這三行在判斷并讀取 ~/.bashrc
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin <==下面這幾行在處理個人化設置
export PATH
```
這個文件內有設置 PATH 這個變量喔!而且還使用了 export 將 PATH 變成環境變量呢! 由于 PATH 在 /etc/profile 當中已經設置過,所以在這里就以累加的方式增加使用者主文件夾下的 ~/bin/ 為額外的可執行文件放置目錄。這也就是說,你可以將自己創建的可執行文件放置到你自己主文件夾下的 ~/bin/ 目錄啦! 那就可以直接執行該可執行文件而不需要使用絕對/相對路徑來執行該文件。
這個文件的內容比較有趣的地方在于 if ... then ... 那一段!那一段程序碼我們會在[第十二章 shell script](../Text/index.html) 談到,假設你現在是看不懂的。 該段的內容指的是“判斷主文件夾下的 ~/.bashrc 存在否,若存在則讀入 ~/.bashrc 的設置”。 bash 配置文件的讀入方式比較有趣,主要是通過一個指令“ source ”來讀取的! 也就是說 ~/.bash_profile 其實會再調用 ~/.bashrc 的設置內容喔!最后,我們來看看整個 login shell 的讀取流程:
圖10.4.1、login shell 的配置文件讀取流程
實線的的方向是主線流程,虛線的方向則是被調用的配置文件!從上面我們也可以清楚的知道,在 CentOS 的 login shell 環境下,最終被讀取的配置文件是“ ~/.bashrc ”這個文件喔!所以,你當然可以將自己的偏好設置寫入該文件即可。 下面我們還要討論一下 source 與 ~/.bashrc 喔!
* source :讀入環境配置文件的指令
由于 /etc/profile 與 ~/.bash_profile 都是在取得 login shell 的時候才會讀取的配置文件,所以, 如果你將自己的偏好設置寫入上述的文件后,通常都是得登出再登陸后,該設置才會生效。那么,能不能直接讀取配置文件而不登出登陸呢? 可以的!那就得要利用 source 這個指令了!
```
[dmtsai@study ~]$ source 配置文件文件名
范例:將主文件夾的 ~/.bashrc 的設置讀入目前的 bash 環境中
[dmtsai@study ~]$ source ~/.bashrc <==下面這兩個指令是一樣的!
[dmtsai@study ~]$ . ~/.bashrc
```
利用 source 或小數點 (.) 都可以將配置文件的內容讀進來目前的 shell 環境中! 舉例來說,我修改了 ~/.bashrc ,那么不需要登出,立即以 source ~/.bashrc 就可以將剛剛最新設置的內容讀進來目前的環境中!很不錯吧!還有,包括 ~/bash_profile 以及 /etc/profile 的設置中, 很多時候也都是利用到這個 source (或小數點) 的功能喔!
有沒有可能會使用到不同環境配置文件的時候?有啊! 最常發生在一個人的工作環境分為多種情況的時候了!舉個例子來說,在鳥哥的大型主機中, 常常需要負責兩到三個不同的案子,每個案子所需要處理的環境變量訂定并不相同, 那么鳥哥就將這兩三個案子分別編寫屬于該案子的環境變量設置文件,當需要該環境時,就直接“ source 變量文件 ”,如此一來,環境變量的設置就變的更簡便而靈活了!
* ~/.bashrc (non-login shell 會讀)
談完了 login shell 后,那么 non-login shell 這種非登陸情況取得 bash 操作接口的環境配置文件又是什么? 當你取得 non-login shell 時,該 bash 配置文件僅會讀取 ~/.bashrc 而已啦!那么默認的 ~/.bashrc 內容是如何?
```
[root@study ~]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i' <==使用者的個人設置
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then <==整體的環境設置
. /etc/bashrc
fi
```
特別注意一下,由于 root 的身份與一般使用者不同,鳥哥是以 root 的身份取得上述的數據, 如果是一般使用者的 ~/.bashrc 會有些許不同。看一下,你會發現在 root 的 ~/.bashrc 中其實已經規范了較為保險的命令別名了。 此外,咱們的 CentOS 7.x 還會主動的調用 /etc/bashrc 這個文件喔!為什么需要調用 /etc/bashrc 呢? 因為 /etc/bashrc 幫我們的 bash 定義出下面的數據:
* 依據不同的 UID 規范出 [umask](../Text/index.html#umask) 的值;
* 依據不同的 UID 規范出提示字符 (就是 PS1 變量);
* 調用 /etc/profile.d/*.sh 的設置
你要注意的是,這個 /etc/bashrc 是 CentOS 特有的 (其實是 Red Hat 系統特有的),其他不同的 distributions 可能會放置在不同的文件名就是了。由于這個 ~/.bashrc 會調用 /etc/bashrc 及 /etc/profile.d/*.sh , 所以,萬一你沒有 ~/.bashrc (可能自己不小心將他刪除了),那么你會發現你的 bash 提示字符可能會變成這個樣子:
```
-bash-4.2$
```
不要太擔心啦!這是正常的,因為你并沒有調用 /etc/bashrc 來規范 PS1 變量啦!而且這樣的情況也不會影響你的 bash 使用。 如果你想要將命令提示字符捉回來,那么可以復制 /etc/skel/.bashrc 到你的主文件夾,再修訂一下你所想要的內容, 并使用 source 去調用 ~/.bashrc ,那你的命令提示字符就會回來啦!
* 其他相關配置文件
事實上還有一些配置文件可能會影響到你的 bash 操作的,下面就來談一談:
* /etc/man_db.conf
這個文件乍看之下好像跟 bash 沒相關性,但是對于系統管理員來說, 卻也是很重要的一個文件!這的文件的內容“規范了使用 [man](../Text/index.html#manual_man) 的時候, man page 的路徑到哪里去尋找!”所以說的簡單一點,這個文件規定了下達 man 的時候,該去哪里查看數據的路徑設置!
那么什么時候要來修改這個文件呢?如果你是以 tarball 的方式來安裝你的數據,那么你的 man page 可能會放置在 /usr/local/softpackage/man 里頭,那個 softpackage 是你的套件名稱, 這個時候你就得以手動的方式將該路徑加到 /etc/man_db.conf 里頭,否則使用 man 的時候就會找不到相關的說明文檔啰。
* ~/.bash_history
還記得我們在[歷史命令](../Text/index.html#history)提到過這個文件吧?默認的情況下, 我們的歷史命令就記錄在這里啊!而這個文件能夠記錄幾筆數據,則與 HISTFILESIZE 這個變量有關啊。每次登陸 bash 后,bash 會先讀取這個文件,將所有的歷史指令讀入內存, 因此,當我們登陸 bash 后就可以查知上次使用過哪些指令啰。至于更多的歷史指令, 請自行回去參考喔!
* ~/.bash_logout
這個文件則記錄了“當我登出 bash 后,系統再幫我做完什么動作后才離開”的意思。 你可以去讀取一下這個文件的內容,默認的情況下,登出時, bash 只是幫我們清掉屏幕的訊息而已。 不過,你也可以將一些備份或者是其他你認為重要的工作寫在這個文件中 (例如清空暫存盤), 那么當你離開 Linux 的時候,就可以解決一些煩人的事情啰!
### 10.4.4 終端機的環境設置: stty, set
我們在[第四章首次登陸 Linux](../Text/index.html) 時就提過,可以在 tty1 ~ tty6 這六個命令行的終端機 (terminal) 環境中登陸,登陸的時候我們可以取得一些字符設置的功能喔! 舉例來說,我們可以利用倒退鍵 (backspace,就是那個←符號的按鍵) 來刪除命令列上的字符, 也可以使用 [ctrl]+c 來強制終止一個指令的運行,當輸入錯誤時,就會有聲音跑出來警告。這是怎么辦到的呢? 很簡單啊!因為登陸終端機的時候,會自動的取得一些終端機的輸入環境的設置啊!
事實上,目前我們使用的 Linux distributions 都幫我們作了最棒的使用者環境了, 所以大家可以不用擔心操作環境的問題。不過,在某些 Unix like 的機器中,還是可能需要動用一些手腳, 才能夠讓我們的輸入比較快樂~舉例來說,利用 [backspace] 刪除,要比利用 [Del] 按鍵來的順手吧! 但是某些 Unix 偏偏是以 [del] 來進行字符的刪除啊!所以,這個時候就可以動動手腳啰~
那么如何查閱目前的一些按鍵內容呢?可以利用 stty (setting tty 終端機的意思) 呢! stty 也可以幫助設置終端機的輸入按鍵代表意義喔!
```
[dmtsai@study ~]$ stty [-a]
選項與參數:
-a :將目前所有的 stty 參數列出來;
范例一:列出所有的按鍵與按鍵內容
[dmtsai@study ~]$ stty -a
speed 38400 baud; rows 20; columns 90; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
....(以下省略)....
```
我們可以利用 stty -a 來列出目前環境中所有的按鍵列表,在上頭的列表當中,需要注意的是特殊字體那幾個, 此外,如果出現 ^ 表示 [Ctrl] 那個按鍵的意思。舉例來說, intr = ^C 表示利用 [ctrl] + c 來達成的。幾個重要的代表意義是:
* intr ?: 送出一個 interrupt (中斷) 的訊號給目前正在 run 的程序 (就是終止啰!);
* quit? : 送出一個 quit 的訊號給目前正在 run 的程序;
* erase : 向后刪除字符,
* kill ?: 刪除在目前命令行上的所有文字;
* eof ??: End of file 的意思,代表“結束輸入”。
* start : 在某個程序停止后,重新啟動他的 output
* stop ?: 停止目前屏幕的輸出;
* susp ?: 送出一個 terminal stop 的訊號給正在 run 的程序。
記不記得我們在[第四章講過幾個 Linux 熱鍵](../Text/index.html#cmd_hkey)啊?沒錯! 就是這個 stty 設置值內的 intr([ctrl]+c) / eof([ctrl]+d) 啰~至于刪除字符,就是 erase 那個設置值啦! 如果你想要用 [ctrl]+h 來進行字符的刪除,那么可以下達:
```
[dmtsai@study ~]$ stty erase ^h # 這個設置看看就好,不必真的實做!不然還要改回來!
```
那么從此之后,你的刪除字符就得要使用 [ctrl]+h 啰,按下 [backspace] 則會出現 ^? 字樣呢! 如果想要回復利用 [backspace] ,就下達 stty erase ^? 即可啊! 至于更多的 stty 說明,記得參考一下 man stty 的內容喔!
問:因為鳥哥的工作經常在 Windows/Linux 之間切換,在 windows 下面,很多軟件默認的儲存快捷按鈕是 [crtl]+s ,所以鳥哥習慣按這個按鈕來處理。 不過,在 Linux 下面使用 vim 時,卻也經常不小心就按下 [crtl]+s !問題來了,按下這個組合鈕之后,整個 vim 就不能動了 (整個畫面鎖死)! 請問鳥哥該如何處置?答:參考一下 stty -a 的輸出中,有個 stop 的項目就是按下 [crtl]+s 的!那么恢復成 start 就是 [crtl]+q 啊!因此, 嘗試按下 [crtl]+q 應該就可以讓整個畫面重新恢復正常咯!
除了 stty 之外,其實我們的 bash 還有自己的一些終端機設置值呢!那就是利用 set 來設置的! 我們之前提到一些變量時,可以利用 set 來顯示,除此之外,其實 set 還可以幫我們設置整個指令輸出/輸入的環境。 例如記錄歷史命令、顯示錯誤內容等等。
```
[dmtsai@study ~]$ set [-uvCHhmBx]
選項與參數:
-u :默認不啟用。若啟用后,當使用未設置變量時,會顯示錯誤訊息;
-v :默認不啟用。若啟用后,在訊息被輸出前,會先顯示訊息的原始內容;
-x :默認不啟用。若啟用后,在指令被執行前,會顯示指令內容(前面有 ++ 符號)
-h :默認啟用。與歷史命令有關;
-H :默認啟用。與歷史命令有關;
-m :默認啟用。與工作管理有關;
-B :默認啟用。與刮號 [] 的作用有關;
-C :默認不啟用。若使用 > 等,則若文件存在時,該文件不會被覆蓋。
范例一:顯示目前所有的 set 設置值
[dmtsai@study ~]$ echo $-
himBH
# 那個 $- 變量內容就是 set 的所有設置啦! bash 默認是 himBH 喔!
范例二:設置 "若使用未定義變量時,則顯示錯誤訊息"
[dmtsai@study ~]$ set -u
[dmtsai@study ~]$ echo $vbirding
-bash: vbirding: unbound variable
# 默認情況下,未設置/未宣告 的變量都會是“空的”,不過,若設置 -u 參數,
# 那么當使用未設置的變量時,就會有問題啦!很多的 shell 都默認啟用 -u 參數。
# 若要取消這個參數,輸入 set +u 即可!
范例三:執行前,顯示該指令內容。
[dmtsai@study ~]$ set -x
++ printf '\033]0;%s@%s:%s\007' dmtsai study '~' # 這個是在列出提示字符的控制碼!
[dmtsai@study ~]$ echo ${HOME}
+ echo /home/dmtsai
/home/dmtsai
++ printf '\033]0;%s@%s:%s\007' dmtsai study '~'
# 看見否?要輸出的指令都會先被打印到屏幕上喔!前面會多出 + 的符號!
```
另外,其實我們還有其他的按鍵設置功能呢!就是在前一小節提到的 /etc/inputrc 這個文件里面設置。 還有例如 /etc/DIR_COLORS* 與 /usr/share/terminfo/* 等,也都是與終端機有關的環境設置文件呢! 不過,事實上,鳥哥并不建議您修改 tty 的環境呢,這是因為 bash 的環境已經設置的很友好了, 我們不需要額外的設置或者修改,否則反而會產生一些困擾。不過,寫在這里的數據, 只是希望大家能夠清楚的知道我們的終端機是如何進行設置的喔! ^_^! 最后,我們將 bash 默認的組合鍵給他匯整如下:
| 組合按鍵 | 執行結果 |
| --- | --- | --- |
| Ctrl + C | 終止目前的命令 |
| Ctrl + D | 輸入結束 (EOF),例如郵件結束的時候; |
| Ctrl + M | 就是 Enter 啦! |
| Ctrl + S | 暫停屏幕的輸出 |
| Ctrl + Q | 恢復屏幕的輸出 |
| Ctrl + U | 在提示字符下,將整列命令刪除 |
| Ctrl + Z | “暫停”目前的命令 |
### 10.4.5 萬用字符與特殊符號
在 bash 的操作環境中還有一個非常有用的功能,那就是萬用字符 (wildcard) ! 我們利用 bash 處理數據就更方便了!下面我們列出一些常用的萬用字符喔:
| 符號 | 意義 |
| --- | --- | --- |
| * | 代表“ 0 個到無窮多個”任意字符 |
| ? | 代表“一定有一個”任意字符 |
| [ ] | 同樣代表“一定有一個在括號內”的字符(非任意字符)。例如 [abcd] 代表“一定有一個字符, 可能是 a, b, c, d 這四個任何一個” |
| [ - ] | 若有減號在中括號內時,代表“在編碼順序內的所有字符”。例如 [0-9] 代表 0 到 9 之間的所有數字,因為數字的語系編碼是連續的! |
| [^ ] | 若中括號內的第一個字符為指數符號 (^) ,那表示“反向選擇”,例如 [^abc] 代表 一定有一個字符,只要是非 a, b, c 的其他字符就接受的意思。 |
接下來讓我們利用萬用字符來玩些東西吧!首先,利用萬用字符配合 ls 找文件名看看:
```
[dmtsai@study ~]$ LANG=C <==由于與編碼有關,先設置語系一下
范例一:找出 /etc/ 下面以 cron 為開頭的文件名
[dmtsai@study ~]$ ll -d /etc/cron* <==加上 -d 是為了僅顯示目錄而已
范例二:找出 /etc/ 下面文件名“剛好是五個字母”的文件名
[dmtsai@study ~]$ ll -d /etc/????? <==由于 ? 一定有一個,所以五個 ? 就對了
范例三:找出 /etc/ 下面文件名含有數字的文件名
[dmtsai@study ~]$ ll -d /etc/*[0-9]* <==記得中括號左右兩邊均需 *
范例四:找出 /etc/ 下面,文件名開頭非為小寫字母的文件名:
[dmtsai@study ~]$ ll -d /etc/[^a-z]* <==注意中括號左邊沒有 *
范例五:將范例四找到的文件復制到 /tmp/upper 中
[dmtsai@study ~]$ mkdir /tmp/upper; cp -a /etc/[^a-z]* /tmp/upper
```
除了萬用字符之外,bash 環境中的特殊符號有哪些呢?下面我們先匯整一下:
| 符號 | 內容 |
| --- | --- |
| # | 注解符號:這個最常被使用在 script 當中,視為說明!在后的數據均不執行 |
| \ | 跳脫符號:將“特殊字符或萬用字符”還原成一般字符 |
| | | 管線 (pipe):分隔兩個管線命令的界定(后兩節介紹); |
| ; | 連續指令下達分隔符號:連續性命令的界定 (注意!與管線命令并不相同) |
| ~ | 使用者的主文件夾 |
| $ | 取用變量前置字符:亦即是變量之前需要加的變量取代值 |
| & | 工作控制 (job control):將指令變成背景下工作 |
| ! | 邏輯運算意義上的“非” not 的意思! |
| / | 目錄符號:路徑分隔的符號 |
| >, >> | 數據流重導向:輸出導向,分別是“取代”與“累加” |
| <, << | 數據流重導向:輸入導向 (這兩個留待下節介紹) |
| ' ' | 單引號,不具有變量置換的功能 ($ 變為純文本) |
| " " | 具有變量置換的功能! ($ 可保留相關功能) |
| ` ` | 兩個“ ` ”中間為可以先執行的指令,亦可使用 $( ) |
| ( ) | 在中間為子 shell 的起始與結束 |
| { } | 在中間為命令區塊的組合! |
以上為 bash 環境中常見的特殊符號匯整!理論上,你的“文件名”盡量不要使用到上述的字符啦!
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀