一、內置命令
所謂 Shell 內置命令,就是由 Bash 自身提供的命令,而不是文件系統中的某個可執行文件。
例如,用于進入或者切換目錄的 cd 命令,雖然我們一直在使用它,但如果不加以注意很難意識到它與普通命令的性質是不一樣的:該命令并不是某個外部文件,只要在 Shell 中你就一定可以運行這個命令。
可以使用 type 來確定一個命令是否是內建命令:
[root@localhost ~]# type cd
cd is a Shell builtin
[root@localhost ~]# type ifconfig
ifconfig is /sbin/ifconfig
由此可見,cd 是一個 Shell 內建命令,而 ifconfig 是一個外部文件,它的位置是/sbin/ifconfig
。
還記得系統變量 PATH嗎?PATH嗎?PATH嗎?PATH 變量包含的目錄中幾乎聚集了系統中絕大多數的可執行命令,它們都是外部命令。
通常來說,內建命令會比外部命令執行得更快,執行外部命令時不但會觸發磁盤 I/O,還需要 fork 出一個單獨的進程來執行,執行完成后再退出。而執行內建命令相當于調用當前 Shell 進程的一個函數。
二、alisa命令
alisa 用來給命令創建一個別名。若直接輸入該命令且不帶任何參數,則列出當前 Shell 進程中使用了哪些別名。現在你應該能理解類似ll
這樣的命令為什么與ls -l
的效果是一樣的吧。
三、echo命令
echo 是一個 Shell 內建命令,用來在終端輸出字符串,并在最后默認加上換行符。
echo 命令輸出結束后默認會換行,如果不希望換行,可以加上
-n
參數默認情況下,echo 不會解析以反斜杠
\
開頭的轉義字符。比如,\n
表示換行,echo 默認會將它作為普通字符對待,我們可以添加-e
參數來讓 echo 命令解析轉義字符有了
-e
參數,我們也可以使用轉義字符\c
來強制 echo 命令不換行了
四、read命令
read 是 Shell 內置命令,用來從標準輸入中讀取數據并賦值給變量。如果沒有進行重定向,默認就是從鍵盤讀取用戶輸入的數據;如果進行了重定向,那么可以從文件中讀取數據。
read 命令的用法為:
read [-options] [variables]
options
表示選項,如下表所示;variables
表示用來存儲數據的變量,可以有一個,也可以有多個。
options
和variables
都是可選的,如果沒有提供變量名,那么讀取的數據將存放到環境變量 REPLY 中。
選項 | 說明 |
---|---|
-a array | 把讀取的數據賦值給數組 array,從下標 0 開始。 |
-d delimiter | 用字符串 delimiter 指定讀取結束的位置,而不是一個換行符(讀取到的數據不包括 delimiter)。 |
-e | 在獲取用戶輸入的時候,對功能鍵進行編碼轉換,不會直接顯式功能鍵對應的字符。 |
-n num | 讀取 num 個字符,而不是整行字符。 |
-p prompt | 顯示提示信息,提示內容為 prompt。 |
-r | 原樣讀取(Raw mode),不把反斜杠字符解釋為轉義字符。 |
-s | 靜默模式(Silent mode),不會在屏幕上顯示輸入的字符。當輸入密碼和其它確認信息的時候,這是很有必要的。 |
-t seconds | 設置超時時間,單位為秒。如果用戶沒有在指定時間內輸入完成,那么 read 將會返回一個非 0 的退出 |
五、exit命令
exit 是一個 Shell 內置命令,用來退出當前 Shell 進程,并返回一個退出狀態;使用$?
可以接收這個退出狀態;
exit 命令可以接受一個整數值作為參數,代表退出狀態。如果不指定,默認狀態值是 0。
一般情況下,退出狀態為 0 表示成功,退出狀態為非 0 表示執行失敗(出錯)了。
exit 退出狀態只能是一個介于 0~255 之間的整數,其中只有 0 表示成功,其它值都表示失敗。
Shell 進程執行出錯時,可以根據退出狀態來判斷具體出現了什么錯誤,比如打開一個文件時,我們可以指定 1 表示文件不存在,2 表示文件沒有讀取權限,3 表示文件類型不對。
六、下表列出了 Bash Shell 中直接可用的內建命令
命令 | 說明 |
---|---|
: | 擴展參數列表,執行重定向操作 |
. | 讀取并執行指定文件中的命令(在當前 shell 環境中) |
alias | 為指定命令定義一個別名 |
bg | 將作業以后臺模式運行 |
bind | 將鍵盤序列綁定到一個 readline 函數或宏 |
break | 退出 for、while、select 或 until 循環 |
builtin | 執行指定的 shell 內建命令 |
caller | 返回活動子函數調用的上下文 |
cd | 將當前目錄切換為指定的目錄 |
command | 執行指定的命令,無需進行通常的 shell 查找 |
compgen | 為指定單詞生成可能的補全匹配 |
complete | 顯示指定的單詞是如何補全的 |
compopt | 修改指定單詞的補全選項 |
continue | 繼續執行 for、while、select 或 until 循環的下一次迭代 |
declare | 聲明一個變量或變量類型。 |
dirs | 顯示當前存儲目錄的列表 |
disown | 從進程作業表中刪除指定的作業 |
echo | 將指定字符串輸出到 STDOUT |
enable | 啟用或禁用指定的內建shell命令 |
eval | 將指定的參數拼接成一個命令,然后執行該命令 |
exec | 用指定命令替換 shell 進程 |
exit | 強制 shell 以指定的退出狀態碼退出 |
export | 設置子 shell 進程可用的變量 |
fc | 從歷史記錄中選擇命令列表 |
fg | 將作業以前臺模式運行 |
getopts | 分析指定的位置參數 |
hash | 查找并記住指定命令的全路徑名 |
help | 顯示幫助文件 |
history | 顯示命令歷史記錄 |
jobs | 列出活動作業 |
kill | 向指定的進程 ID(PID) 發送一個系統信號 |
let | 計算一個數學表達式中的每個參數 |
local | 在函數中創建一個作用域受限的變量 |
logout | 退出登錄 shell |
mapfile | 從 STDIN 讀取數據行,并將其加入索引數組 |
popd | 從目錄棧中刪除記錄 |
printf | 使用格式化字符串顯示文本 |
pushd | 向目錄棧添加一個目錄 |
pwd | 顯示當前工作目錄的路徑名 |
read | 從 STDIN 讀取一行數據并將其賦給一個變量 |
readarray | 從 STDIN 讀取數據行并將其放入索引數組 |
readonly | 從 STDIN 讀取一行數據并將其賦給一個不可修改的變量 |
return | 強制函數以某個值退出,這個值可以被調用腳本提取 |
set | 設置并顯示環境變量的值和 shell 屬性 |
shift | 將位置參數依次向下降一個位置 |
shopt | 打開/關閉控制 shell 可選行為的變量值 |
source | 讀取并執行指定文件中的命令(在當前 shell 環境中) |
suspend | 暫停 Shell 的執行,直到收到一個 SIGCONT 信號 |
test | 基于指定條件返回退出狀態碼 0 或 1 |
times | 顯示累計的用戶和系統時間 |
trap | 如果收到了指定的系統信號,執行指定的命令 |
type | 顯示指定的單詞如果作為命令將會如何被解釋 |
typeset | 聲明一個變量或變量類型。 |
ulimit | 為系統用戶設置指定的資源的上限 |
umask | 為新建的文件和目錄設置默認權限 |
unalias | 刪除指定的別名 |
unset | 刪除指定的環境變量或 shell 屬性 |
wait | 等待指定的進程完成,并返回退出狀態碼 |