NAME

bash - GNU Bourne-Again SHell (GNU 命令解釋程式 “Bourne二世”)

概述(SYNOPSIS)

bash [options] [file]

版權所有(COPYRIGHT)

Bash is Copyright (C) 1989-2002 by the Free Software Foundation, Inc.

描述(DESCRIPTION)

Bash 是一個與 sh 相容的命令解釋程式,可以執行從標準輸入或者檔案中讀取的命令。 Bash 也整合了 KornC Shell ( kshcsh) 中的優秀特性。
Bash 的目標是成為遵循 IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2,可移植作業系統規約: shell 和工具) 的實現。

選項(OPTIONS)

除了在 set 內建命令的文件中講述的單字元選項 (option) 之外, bash 在啟動時還解釋下列選項。
-c string
如果有 -c 選項,那麼命令將從 string 中讀取。如果 string 後面有引數 (argument),它們將用於給位置引數 (positional parameter,以 $0 起始) 賦值。
-i
如果有 -i 選項,shell 將互動地執行 ( interactive )。
-l
選項使得 bash 以類似登入 shell (login shell) 的方式啟動 (參見下面的 啟動(INVOCATION) 章節)。
-r
如果有 -r 選項,shell 成為受限的 ( restricted ) (參見下面的 受限的shell(RESTRICTED SHELL) 章節)。
-s
如果有 -s 選項,或者如果選項處理完以後,沒有引數剩餘,那麼命令將從標準輸入讀取。 這個選項允許在啟動一個互動 shell 時可以設定位置引數。
-D
向標準輸出列印一個以 $ 為前導的,以雙引號引用的字串列表。 這是在當前語言環境不是 CPOSIX 時,指令碼中需要翻譯的字串。 這個選項隱含了 -n 選項;不會執行命令。
[-+]O [shopt_option]
shopt_option 是一個 shopt 內建命令可接受的選項 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。 如果有 shopt_option-O 將設定那個選項的取值; +O 取消它。 如果沒有給出 shopt_optionshopt 將在標準輸出上列印設為允許的選項的名稱和值。 如果啟動選項是 +O,輸出將以一種可以重用為輸入的格式顯示。
--
-- 標誌選項的結束,禁止其餘的選項處理。任何 -- 之後的引數將作為檔名和引數對待。引數 - 與此等價。
Bash 也解釋一些多位元組的選項。在命令列中,這些選項必須置於需要被識別的單字元引數之前。
--dump-po-strings
等價於 -D,但是輸出是 GNU gettext po (可移植物件) 檔案格式
--dump-strings
等價於 -D
--help
在標準輸出顯示用法資訊併成功退出
--init-file file
--rcfile file
如果 shell 是互動的,執行 file 中的命令,而不是標準的個人初始化檔案 ~/.bashrc (參見下面的 啟動(INVOCATION) 章節)
--login
等價於 -l
--noediting
如果 shell 是互動的,不使用 GNU readline 庫來讀命令列
--noprofile
不讀取系統範圍的啟動檔案 /etc/profile 或者任何個人初始化檔案 ~/.bash_profile, ~/.bash_login, 或 ~/.profile 。預設情況下, bash 在作為登入 shell 啟動時讀取這些檔案 (參見下面的 啟動(INVOCATION) 章節)
--norc
如果 shell 是互動的,不讀取/執行個人初始化檔案 ~/.bashrc 這個選項在 shell 以 sh 命令啟動時是預設啟用的
--posix
如果預設操作與 POSIX 1003.2 標準不同的話,改變 bash 的行為來符合標準 ( posix mode)
--restricted
shell 成為受限的 (參見下面的 受限的shell(RESTRICTED SHELL) 章節)
--rpm-requires
產生一個為使指令碼執行,需要的檔案的列表。 這個選項包含了 -n 選項。 它是為了避免進行編譯期錯誤檢測時的限制-- Backticks, [] tests, 還有 evals 不會被解釋,一些依賴關係可能丟失
--verbose
等價於 -v
--version
在標準輸出顯示此 bash 的版本資訊併成功退出。

引數(ARGUMENTS)

如果選項處理之後仍有引數剩餘,並且沒有指定 -c-s 選項,第一個引數將假定為一個包含 shell 命令的檔案的名字。 如果 bash 是以這種方式啟動的, $0 將設定為這個檔案的名字,位置引數將設定為剩餘的其他引數。 Bash 從這個檔案中讀取並執行命令,然後退出。 Bash 的退出狀態是指令碼中執行的最後一個命令的退出狀態。 如果沒有執行命令,退出狀態是0。 嘗試的步驟是先試圖開啟在當前目錄中的這個檔案,接下來, 如果沒有找到,shell 將搜尋指令碼的 PATH 環境變數中的路徑。

啟動(INVOCATION)

login shell 登入 shell,引數零的第一個字元是 - ,或者啟動時指定了 --login 選項的 shell。
interactive 互動的 shell,是一個啟動時沒有指定非選項的引數,並且沒有指定 -c 選項,標準輸出和標準輸入都連線到了終端 (在 isatty(3) 中判定) 的shell,或者啟動時指定了 -i 選項的 shell。如果 bash 是互動的, PS1 環境變數將被設定,並且 $- 包含 i ,允許一個 shell 指令碼或者一個啟動檔案來檢測這一狀態。
下列段落描述了 bash 如何執行它的啟動檔案。如果這些啟動檔案中的任一個存在但是不可讀取, bash 將報告一個錯誤。檔名中的波浪號 (~,tilde) 將像 EXPANSION 章節中 Tilde Expansion 段描述的那樣展開。
bash 是作為互動的登入 shell 啟動的,或者是一個非互動的 shell 但是指定了 --login 選項, 它首先讀取並執行 /etc/profile 中的命令,只要那個檔案存在。 讀取那個檔案之後,它以如下的順序查詢 ~/.bash_profile, ~/.bash_login, 和 ~/.profile, 從存在並且可讀的第一個檔案中讀取並執行其中的命令。 --noprofile 選項可以用來在 shell 啟動時阻止它這樣做。
當一個登入 shell 退出時, bash 讀取並執行檔案 ~/.bash_logout 中的命令,只要它存在。
當一個互動的 shell 但不是登入 shell 啟動時, bash 從檔案 ~/.bashrc 中讀取並執行命令,只要它存在。可以用 --norc 選項來阻止它這樣做。 --rcfile file 選項將強制 bash 讀取並執行檔案 file 中的命令,而不是 ~/.bashrc 中的。
bash 以非互動的方式啟動時,例如在執行一個 shell 指令碼時,它在環境中查詢變數 BASH_ENV ,如果它存在則將它的值展開,使用展開的值作為一個檔案的名稱,讀取並執行。 Bash 運作的過程就如同執行了下列命令:
 
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
 
但是沒有使用 PATH 變數的值來搜尋那個檔名。
如果 bash 以名稱 sh 啟動,它試圖模仿 (mimic) sh 歷史版本的啟動過程,儘可能地相似,同時也遵循 POSIX 標準。 當作為互動式登入 shell 啟動時,或者是非互動但使用了 --login 選項 啟動的時候,它首先嚐試讀取並執行檔案 /etc/profile~/.profile, 中的命令. 選項 --noprofile 用於避免這種行為.當使用命令 sh 來啟動一個互動式的 shell 時, bash 查詢環境變數 ENV, 如果有定義的話就擴充套件它的值,然後使用擴充套件後的值作為要讀取和執行的檔案 的名稱.由於使用 sh 啟動的 shell 不會讀取和執行任何其他的啟動檔案,選項 --rcfile 沒有意義.使用名稱 sh 啟動的非互動的 shell 不會讀取任何其他啟動檔案.當以 sh 啟動時, bash 在讀取啟動檔案之後進入 posix 模式.
bashposix 模式啟動時,(和使用 --posix 命令列引數效果相同),它遵循 POSIX 標準. 這種模式下,互動式 shell 擴充套件 ENV 環境變數的值,讀取並執行以擴充套件後值為檔名的配置檔案. 不會讀取其他檔案.
Bash 試著檢測它是不是由遠端 shell 守護程式,通常為 rshd 啟動的.如果 bash 發現它是由 rshd 啟動的,它將讀取並執行 ~/.bashrc 檔案中的命令, 只要這個檔案存在並且可讀.如果以 sh 命令啟動,它不會這樣做. 選項 --norc 可以用來阻止這種行為,選項 --rcfile 用來強制讀取另一個檔案,但是通常 rshd 不會允許它們, 或者用它們來啟動 shell.
如果 shell 是以與真實使用者(組) id 不同的有效使用者(組) id 來啟動的, 並且沒有 - 選項,那麼它不會讀取啟動檔案, 也不會從環境中繼承 shell 函式. 環境變數中如果出現 SHELLOPTS, 它將被忽略.有效使用者 id 將設定為真實使用者 id. 如果啟動時給出了 -
 
選項,那麼啟動時的行為是類似的, 但是不會重置有效使用者 id.

定義(DEFINITIONS)

下列定義在文件餘下部分中通用.
blank 空白
一個空格或是 tab .
word 詞
一個字元序列, shell 將它們視為一個結構單元. 也稱為一個 token片段。
name 名稱
一個只由字母,數字和下劃線構成的詞,並且以字元或下劃線起始. 也稱為一個 word identifier識別符號.
metacharacter 元字元
一個字元, 如果不是引用的話, 將成為詞的分隔符. 它是如下字元之一:
 
| & ; ( ) < > space tab
control operator 控制運算子
一個 token(標識), 擁有控制功能. 它是如下符號之一:
|| & && ; ;; ( ) | <newline>

保留字("RESERVED WORDS")

Reserved words(保留字) 是對 shell 有特殊意義的詞. 下列詞被識別為保留的, 如果不是引用, 並且不是一個簡單命令的起始詞 (參見下面的 shell語法("SHELL GRAMMAR") ), 也不是 case 或者 for 命令的第三個詞:
! case do done elif else esac fi for function if in select then until while { } time [[ ]]

shell語法("SHELL GRAMMAR")

Simple Commands 簡單命令

simple command(簡單命令) 是(可選的)一系列變數賦值, 緊接著是 blank(空格) 分隔的詞和重定向, 然後以一個 control operator 結束. 第一個詞指明瞭要執行的命令, 它被作為第 0 個引數. 其餘詞被作為這個命令的引數.
simple command 簡單命令的返回值是它的退出狀態, 或是 128+ n, 如果命令被 signal(訊號) n 結束的話.

Pipelines 管道

pipeline(管道) 是一個或多個命令的序列,用字元 | 分隔。管道的格式是這樣:
[ time [-p]] [ ! ] command [ | command2 ... ]
命令 command 的標準輸出透過管道連線到命令 command2 的標準輸入。連線是在命令指定的任何重定向之前進行的(參見下面的 REDIRECTION 重定向)。
如果保留字 ! 作為管道字首,管道的退出狀態將是最後一個命令的退出狀態的邏輯非值。 否則,管道的退出狀態就是最後一個命令的。 shell 在返回退出狀態值之前,等待管道中的所有命令返回。
如果保留字 time 作為管道字首,管道中止後將給出執行管道耗費的使用者和系統時間。 選項 -p 將使輸出符合 POSIX 指定的格式。 環境變數 TIMEFORMAT 可以設定為一個格式字串,指定時間資訊應當如何顯示;參見下面的 Shell Variables 環境變數TIMEFORMAT 的講述。
管道中的每個命令都作為單獨的程序來執行(即,在一個子 shell 中啟動)。

Lists 序列

list(序列)是一個或多個管道,用運算子 ;, &, &&, 或 ⎪⎪ 分隔的序列, 並且可以選擇用 ;, &, 或 <newline>新行符結束.
這些序列運算子中, &&⎪⎪ 優先順序相同,其次是 ;&, 它們的優先順序是相同的。
序列中可以有一個或多個新行符來分隔命令,而不是使用分號分隔。
如果一個命令是由控制運算子 & 結束的, shell 將在後臺的子 shell 中執行這個命令。 shell 不會等待命令執行結束,返回狀態總是 0。以分號 ; 分隔的命令會被順序執行;shell 會等待每個命令依次結束。返回狀態是最後執行的命令的返回狀態。
控制運算子 &&⎪⎪ 分別代表 AND 和 OR 序列。一個 AND 序列的形式是
command1 && command2
command2 只有在 command1 返回 0 時才被執行。
一個 OR 序列的形式是
command1 ⎪⎪ command2
command2 只有在 command1 返回非 0 狀態時才被執行。AND 和 OR 序列的返回狀態是序列中最後執行的命令的返回狀態。

Compound Commands 複合命令

compound command(複合命令) 是如下情況之一:
(list)
list 序列將在一個子 shell 中執行。變數賦值和影響 shell 環境變數的內建命令在命令結束後不會再起作用。 返回值是序列的返回值。
{ list; }
list 序列將在當前 shell 環境中執行。序列必須以一個新行符或分號結束。 這種做法也稱為 group command(命令組)。返回值是序列的返回值。注意與元字元 () 不同, {}reserved words(保留字),必須出現在能夠識別保留字的場合。 由於它們不會產生斷詞(cause a word break),它們和序列之間必須用空格分開。
((expression))
表示式 expression 將被求值。求值規則在下面的 算術求值 (ARITHMETIC EVALUATION) 章節中描述。如果表示式的值非零,返回值就是 0;否則返回值是 1。這種做法和 let "expression " 等價。
[[ expression ]]
返回 0 或 1,取決於條件表示式 expression 求值的情況。 表示式是由下面 CONDITIONAL EXPRESSIONS 條件表示式 章節中描述的原語(primaries) 組成。 [[]] 中的詞不會進行詞的拆分和路徑的擴充套件處理; 而tilde 擴充套件,引數和變數擴充套件,算術擴充套件,命令替換,函式替換和引用的去除則都將進行。 當使用 ==!= 運算子時,運算子右邊的字串被認為是一個模式,根據下面 Pattern Matching(模式匹配) 章節中的規則進行匹配。 如果匹配則返回值是 0,否則返回 1。模式的任何部分可以被引用,強制使它作為一個字串而被匹配。 表示式可以用下列運算子結合起來。根據優先順序的降序列出如下:
( expression )
返回表示式 expression 的值。括號可以用來提升運算子的優先順序。
! expression
返回真,如果表示式 expression 返回假。
expression1 && expression2
返回真,如果表示式 expression1expression2 都返回真。
expression1 || expression2
返回真,如果表示式 expression1 或者 expression2 二者之一返回真。
&&(與) 和 || 運算子不會對錶達式 expression2 求值,如果 expression1 可以決定整個條件表示式的返回值的話。
for name [ in word ] ; do list ; done
in 之後的一系列詞會被擴充套件,產生一個專案列表。變數 name 被依次賦以這個列表中的每個元素, 序列 list 每次都被執行。如果 in word 被忽略,那麼 for 命令遍歷 已設定的位置引數(positional parameter,參見下面的 PARAMETERS 引數), 為每一個執行一次序列 list。 返回值是最後一個命令的返回值。如果 in 之後的詞擴充套件的結果是空列表,就不會執行任何命令,返回值是 0。
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
首先,算術表示式 expr1 被根據下面 算術求值 (ARITHMETIC EVALUATION) 中的規則進行求值。 然後算術表示式 expr2 被迴圈求值,直到它等於 0。每次 expr2 結果非零時,序列 list 都被執行, 算術表示式 expr3 被求值。如果任何表示式被忽略,將被視為執行結果是 1。 返回值是序列 list 中被執行的最後一個命令的返回值;或者是 false,如果任何表示式非法的話。
select name [ in word ] ; do list ; done
in 之後的一系列詞會被擴充套件,產生一個專案列表。這個擴充套件後的詞集合被輸出到標準錯誤上,每個前面 加上一個數字。如果 in word 被忽略,將輸出位置引數 (參見下面的 PARAMETERS 引數 章節)。 PS3 提示符將被顯示出來,等待從標準輸入得到一行輸入。如果 輸入是一個數字且顯示中有對應的詞,那麼變數 name 的值將設定為這個詞。如果輸入一個空行,那麼詞和提示符將再次顯示出來。如果讀入了一個 EOF,命令就結束。 任何其他值將設定變數 name 為空。讀入的行儲存為變數 REPLY. 序列 list 在每次選擇之後都會執行,直到執行了一個 break 命令。 select 的退出狀態是序列 list 中執行的最後一個命令的退出狀態,如果沒有執行命令就是 0。
case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
case 命令首先擴充套件 word, 然後依次試著用每個 pattern 來匹配它, 使用與路徑擴充套件相同的匹配規則(參見下面的 Pathname Expansion 路徑擴充套件 章節)。如果找到一個匹配,相應的序列將被執行。找到一個匹配之後,不會再嘗試其後的匹配。 如果沒有模式可以匹配,返回值是 0。否則,返回序列中最後執行的命令的返回值。
if list; then list; [ elif list; then list; ] ... [ else list; ] fi
序列 if list 被執行。如果退出狀態是 0, then list 將被執行。否則,每個 elif 將被一次執行,如果退出狀態是 0,相應的 then list 將被執行,命令結束。 否則, else list 將被執行,如果存在的話。 退出狀態是最後執行的命令的退出狀態,或者是 0,如果所有條件都不滿足。
while list; do list; done
until list; do list; done
while 命令不斷地執行序列 do list,直到序列中最後一個命令返回 0。 until 命令和 while 命令等價,除了對條件的測試恰好相反;序列 do list 執行直到序列中最後一個命令返回非零狀態值。 whileuntil 命令的退出狀態是序列 do list 中最後一個命令的退出狀態, 或者是 0,如果沒有執行任何命令。
[ function ] name () { list; }
這樣可以定義一個名為 name 的函式。函式體 body 是包含在 { 和 } 之間的命令序列 list。 在指定將 name 作為一個命令執行的場合,這個序列將被執行。 函式的退出狀態是函式體最後執行的命令的退出狀態(參見下面的 FUNCTIONS 函式 章節)。

註釋(COMMENTS)

在非互動的 shell 中或者使用內建命令 shopt 啟用了 interactive_comments 選項的互動的 shell 中,以 # 起始的詞使得這個詞和所有同一行上所有剩餘的字元都被忽略。沒有啟用 interactive_comments 選項的互動式 shell 不允許出現註釋。這個選項在互動式 shell 中是預設啟用的 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。

引用(QUOTING)

引用 Quoting 用來去掉特定字元或詞的特殊意義。引用可以用來禁止對特殊字元的處理, 阻止保留字被識別,還用來阻止引數的擴充套件。
上面在 DEFINITIONS 定義 中列出的每個元字元 metacharacters 對於 shell 都有特殊意義。如果要表達它的本義,必須引用它。
在使用命令列歷史擴充套件功能時, history expansion 字元,通常是 !,必須被引用,才不會進行歷史擴充套件。
有三種引用機制:跳脫字元 (escape character), 單引號和雙引號。
一個未被引用的反斜槓 ( \) 是跳脫字元 escape character。 它保留其後下一個字元的字面意義,除非那是一個新行符。 如果 \ 和新行符成對出現,並且反斜槓自身沒有被引用,那麼 \<newline> 被視為續行標誌 (意思是,它被從輸入流中刪除並忽略了)。
將字元放在單引號之中,將保留引用中所有字元的字面意義。單引號不能包含在單引號引用之中,即使前面加上了反斜槓。
將字元放在雙引號中,同樣保留所有字元的字面意義,例外的情況是 $, `, 和 \。 字元 $` 在雙引號中仍然具有特殊意義。反斜槓只有後面是下列字元時才有特殊意義: $, `, ", \, 或 <newline>. 雙引號可以包含在雙引號引用中,但要在前面加上一個反斜槓。
特殊的引數 *@ 在雙引號中有特殊意義(參見下面的 PARAMETERS 引數 章節)。
形式為 $'string' 的詞會被特殊處理。它被擴充套件為 string,其中的反斜槓跳脫字元 被替換為 ANSI C 標準中規定的字元。反斜槓轉義序列,如果存在的話,將做如下轉換:
\a
alert (bell) 響鈴
\b
backspace 回退
\e
an escape character 字元 Esc
\f
form feed 進紙
\n
new line 新行符
\r
carriage return 回車
\t
horizontal tab 水平跳格
\v
vertical tab 豎直跳格
\\
backslash 反斜槓
\'
single quote 單引號
\nnn
一個八位元字元,它的值是八進位制值 nnn (一到三個數字)。
\xHH
一個八位元字元,它的值是十六進位制值 HH (一到兩個十六進位制數字)。
\cx
一個 ctrl-x 字元
擴充套件結果是單引號引用的,就好像 $ 符號不存在一樣。
雙引號引用字串前面加上一個 $ 符號將使得這個字串被根據當前語言環境 (locale) 來翻譯。 如果當前語言環境是 C 或者 POSIX,這個符號將被忽略。 如果這個字串被翻譯並替換了,那麼替換結果是雙引號引用的。

引數(PARAMETERS)

一個引數 parameter 是一個儲存值的實體。它可以是一個名稱 name, 一個數字或者是下面 Special Parameters 特殊引數 章節中列出的特殊字元之一。從 shell 的角度來看,一個變數 variable 是一個由名稱 name 代表的引數。一個變數有一個值 value 以及零個或多個屬性 attibutes。屬性可以使用內建命令 declare 來設定(參見下面 shell 內建命令(SHELL BUILTIN COMMANDS) 章節中對 declare 的描述)。
如果給一個引數賦值,那麼它就被定義了。空字串是有效的值。一旦一個變數被定義了,它只能用內建命令 unset 來取消(參見下面 shell 內建命令(SHELL BUILTIN COMMANDS) 章節).
一個變數 variable 可以用這樣的語句形式來賦值:
name=[value]
如果沒有給出值 value, 變數就被賦為空字串。所有值 values 都經過了波浪線擴充套件,引數和變數擴充套件,命令替換,算術擴充套件和引用的刪除(參見下面的 EXPANSION 擴充套件 章節)。如果變數設定了 integer 整數 屬性,那麼值 value 將進行算術擴充套件,即使沒有應用 $((...)) 擴充套件 (參見下面的 Arithmetic Expansion 算術擴充套件 章節)。 不會進行詞的拆分,除非是下面 Special Parameters 特殊引數 中提到的 "$@"。 不會進行路徑的擴充套件。賦值語句也出現在下列內建命令中,作為它們的引數: declare, typeset, export, readonly, 和 local

Positional Parameters 位置引數

位置引數 positional parameter 是以一或多個數字代表的引數,除了 0。位置引數是在 shell 啟動時,根據它的引數來賦值的, 也可以用內建命令 set 來重新賦值。位置引數不能用賦值語句來賦值。在一個 shell 函式被執行的時候,位置引數會被暫時地替換掉 (參見下面的 FUNCTIONS 函式 章節)。
當位置引數由兩個以上的數字構成時,它必須放在括號內 (參見下面的 EXPANSION 擴充套件 章節)。

Special Parameters 特殊引數

shell 對一些引數做特殊處理。這些引數只能被引用而不能被賦值。
*
擴充套件為位置引數,從 1 開始。如果擴充套件發生在雙引號中,它擴充套件為一個詞,值是各個引數,以特殊變數 IFS 的第一個字元分隔。也就是說," $*" 等價於 " $1c$2c...",這裡 c 是變數 IFS 的第一個字元。如果沒有設定 IFS, 那麼引數將用空格分隔。 IFS
@
擴充套件為位置引數,從 1 開始。如果擴充套件發生在雙引號中,每個引數都將擴充套件為一個詞。也就是說, " $@" 等價於 " $1" " $2" ... 如果位置引數不存在," $@" 和 $@ 擴充套件為空 (即,它們被刪除了)。
#
擴充套件為位置引數的個數,以十進位制表示。
?
擴充套件為最近執行的前臺管道的狀態。
-
擴充套件為當前選項標誌。標誌是在啟動時或以內建命令 set 指定的,或者是 shell 自身設定的 (例如選項 -i )。
$
擴充套件為 shell 的程序 ID。在一個 () 子 shell 中,它擴充套件為當前 shell 的 程序 ID 而不是子 shell 的。
!
擴充套件為最近一次執行的後臺 (非同步) 命令的程序號。
0
擴充套件為 shell 或者 shell 指令碼的名稱。這個變數是在 shell 初始化時設定的。如果 bash 是執行指令碼檔案時啟動的, $0 將設定為那個檔案的名稱。如果 bash 啟動時的引數包含 -c, 那麼 $0 被設定為啟動命令列被執行後的第一個引數,如果有的話。否則,它被設定為用來啟動 bash 的檔名,就是引數 0。
_
shell 啟動時,設定為 shell 或引數中被執行的 shell 指令碼的絕對路徑名。 然後,在擴充套件時擴充套件為上一個命令的最後一個引數。它也被設定為被執行的每個命令的檔案全名並且 被設定到這個命令執行的環境當中。當檢查郵件時,這個引數儲存著正在檢查的郵件檔案的名稱。

Shell Variables 變數

shell 定義了下列變數:
BASH
擴充套件為用來啟動當前 bash 例項的檔案全名。
BASH_VERSINFO
一個只讀陣列變數,成員儲存著當前 bash 例項的版本資訊。賦予陣列元素的值是如下這些:
BASH_VERSINFO[0]
主版本號 (release).
BASH_VERSINFO[1]
次版本號 (version).
BASH_VERSINFO[2]
補丁版本
BASH_VERSINFO[3]
編譯資訊
BASH_VERSINFO[4]
釋出時的狀態 (例如, beta1).
BASH_VERSINFO[5]
MACHTYPE 平臺型別
BASH_VERSION
擴充套件為一個字串,描述了這個 bash. 例項的版本。
COMP_CWORD
${COMP_WORDS} 的索引,指向當前游標位置所在的詞。 這個變數只有在被可程式設計補全功能 (參見下面的 Programmable Completion 章節) 呼叫的 shell 函式中才可用。
COMP_LINE
當前命令列。這個變數只有在被命令補全功能呼叫的 shell 函式和外部命令中才可用。
COMP_POINT
相對於當前命令起始處的當前游標位置。如果當前游標位置是當前命令的末端, 它的值就和 ${#COMP_LINE} 相等。 這個變數只有在被命令補全功能呼叫的 shell 函式和外部命令中才可用。
COMP_WORDS
一個數組變數 (參見下面的 Arrays(陣列)一節),由當前命令列的各個單詞構成。 這個變數只有在被命令補全功能呼叫的 shell 函式中才可用。
DIRSTACK
一個數組變數,包含當前目錄棧的內容。棧中的目錄排列的順序就是用內建命令 dirs 顯示時的順序。對這個陣列變數的成員賦值可以用來修改棧中已有的目錄,但是要新增和刪除目錄就必須使用 內建命令 pushdpopd。 對它賦值不會改變當前目錄。如果取消了 DIRSTACK 的定義,它就失去了它的特殊意義,即使後來重新定義它。
EUID
擴充套件為當前使用者的有效使用者 ID。它在 shell 啟動時設定。它是隻讀的。
FUNCNAME
當前執行的 shell 函式名。這個變數只有在執行一個 shell 函式時存在。向 FUNCNAME 賦值沒有效果並且返回一個錯誤。如果取消了 FUNCNAME 的定義,它就失去了特殊的意義,即使後來重新定義它。
GROUPS
一個數組變數,包含當前使用者所屬的組的列表。向 GROUPS 賦值沒有效果並且返回一個錯誤。如果取消了 GROUPS 的定義,它就失去了特殊的意義,即使後來重新定義它。
HISTCMD
當前命令的歷史編號,或者歷史列表中的索引。如果取消了 HISTCMD 的定義,它就失去了特殊的意義,即使後來重新定義它。
HOSTNAME
自動設定為當前的主機名。
HOSTTYPE
自動設定為一個字串,唯一地標識著正在執行 bash 的機器型別。預設值是系統相關的。
LINENO
每次引用這個引數時,shell 將它替換為一個指示在指令碼或函式中當前行號的十進位制數字(從 1 開始)。 如果不是在指令碼或函式中,替換得到的值不一定有意義。如果取消了 LINENO 的定義,它就失去了特殊的意義,即使後來重新定義它。
MACHTYPE
自動設定為一個字串,完整的描述了正在執行 bash 的系統型別,格式是標準的 GNU cpu-company-system 格式。預設值是系統相關的。
OLDPWD
上一次命令 cd 設定的工作目錄。
OPTARG
內建命令 getopts 處理的最後一個選項引數值 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。
OPTIND
內建命令 getopts 將處理的下一個引數的索引 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。
OSTYPE
自動設定的一個字串,描述了正在執行 bash 的作業系統。預設值是系統相關的。
PIPESTATUS
一個數組變數 (參見下面的 Arrays 陣列 章節),包含最近執行的前臺管道中的程序(可能只包含一個命令)的退出狀態。
PPID
shell 的父程序的程序號。這個變數是隻讀的。
PWD
cd 命令設定的當前工作目錄。
RANDOM
每次引用這個引數時,都會產生一個 0 到 32767 之間的隨機整數。可以透過向 RANDOM 賦值來初始化隨機數序列。如果取消了 RANDOM 的定義,它就失去了特殊的意義,即使後來重新定義它。
REPLY
變數的值將作為內建命令 read 的輸入,如果命令沒有引數的話。
SECONDS
每次引用這個引數時,返回 shell 自執行以來的秒數。如果向 SECONDS 賦值,此後對它的引用將返回自賦值時起的秒數加上所賦予的值。如果取消 SECONDS 的定義,它就失去了特殊的意義,即使後來重新定義它。
SHELLOPTS
一個冒號分隔的被允許的 shell 選項列表。列表中每個詞都是內建命令 set-o 選項的有效引數。 SHELLOPTS 中出現的選項也是 set -o 顯示為 on 的選項。如果 bash 啟動時從環境中找到這個變數,那麼在讀取任何配置檔案之前,列表中的每個選項都將被設定。這個變數是隻讀的。
SHLVL
每次啟動一個 bash 的例項時都會增加。
UID
擴充套件為當前使用者的 ID,在啟動時初始化。這個變數是隻讀的。
下列變數被 shell 使用。有時 bash 會為變數賦預設值;這些情況在下面會標出。
BASH_ENV
如果 bash 在執行一個 shell 指令碼時設定了這個變數,它的值將被解釋為一個檔名, 包含著初始化 shell 用到的命令,就像 ~/.bashrc 中一樣。 BASH_ENV 的值在被解釋為一個檔名之前要經過引數擴充套件,命令替換和算術擴充套件。不會使用 PATH 來查詢結果檔名。
CDPATH
命令 cd 的搜尋路徑。這是一個冒號分隔的目錄列表,shell 從中查詢 cd 命令的目標目錄。可以是這樣: ".:~:/usr".
COLUMNS
用在內建命令 select 當中,用來判斷輸出選擇列表時的終端寬度。 自動根據 SIGWINCH 訊號來設定。
COMPREPLY
一個數組變數,bash 從中讀取可能的命令補全。 它是由命令補全功能呼叫的 shell 函式產生的。
FCEDIT
內建命令 fc 預設的編輯器。
FIGNORE
一個冒號分隔的字尾名列表,在進行檔名補全時被忽略 (參見下面的 READLINE 章節)。一個字尾滿足其中之一的檔名被排除在匹配的檔名之外。可以是這樣: ".o:~".
GLOBIGNORE
一個冒號分隔的模式列表,定義了路徑名擴充套件時要忽略的檔名集合。 如果一個檔名與路徑擴充套件模式匹配,同時匹配 GLOBIGNORE 中的一個模式時,它被從匹配列表中刪除。
HISTCONTROL
如果設定為 ignorespace, 以 space 開頭的行將不會插入到歷史列表中。如果設定為 ignoredups, 匹配上一次歷史記錄的行將不會插入。設定為 ignoreboth 會結合這兩種選項。如果沒有定義,或者設定為其他值,所有直譯器讀取的行都將存入歷史列表, 但還要經過 HISTIGNORE 處理。這個變數的作用可以被 HISTIGNORE 替代。多行的組合命令的第二和其餘行都不會被檢測,不管 HISTCONTROL 是什麼,都會加入到歷史中。
HISTFILE
儲存命令歷史的檔名 (參見下面的 HISTORY 歷史 章節)。預設值是 ~/.bash_history。如果取消定義,在互動式 shell 退出時 命令歷史將不會儲存。
HISTFILESIZE
歷史檔案中包含的最大行數。當為這個變數賦值時,如果需要的話,歷史檔案將被截斷 來容納不超過這個值的行。預設值是 500。歷史檔案在互動式 shell 退出時 也會被截斷到這個值。
HISTIGNORE
一個冒號分隔的模式列表,用來判斷那個命令列應當儲存在歷史列表中。每個模式 都定位於行首,必須匹配整行 (沒有假定新增 ` *')。在 HISTCONTROL 指定的測試結束後,這裡的每個模式都要被測試。除了平常的 shell 模式匹配字元, ` &' 匹配上一個歷史行。` &' 可以使用反斜槓來轉義;反斜槓在 嘗試匹配之前將被刪除。多行的組合命令的第二行以及後續行都不會被測試,不管 HISTIGNORE 是什麼,都將加入到歷史中。
HISTSIZE
命令歷史中儲存的歷史數量 (參見下面的 HISTORY 歷史 章節)。預設值是 500。
HOME
當前使用者的個人目錄;內建命令 cd 的預設引數。在執行波浪線擴充套件時也用到這個變數。
HOSTFILE
包含一個格式和 /etc/hosts 相同的檔名,當 shell 需要補全主機名時要讀取它。shell 執行過程中 可以改變可能的主機名補全列表;改變之後下一次需要主機名補全時 bash 會將新檔案的內容新增到舊列表中。如果定義了 HOSTFILE 但是沒有賦值, bash 將嘗試讀取 /etc/hosts 檔案來獲得可能的主機名補全列表。當取消 HOSTFILE 的定義時,主機名列表將清空。
IFS
內部欄位分隔符 Internal Field Separator 用來在擴充套件之後進行分詞,使用內部命令 read 將行劃分成詞。預設值是 ``<space><tab><newline>''。
IGNOREEOF
控制互動式 shell 接受到唯一一個 EOF 字元時的行為。如果有定義,值是需要在一行的開始連續輸入 EOF 字元,直到可以使 bash 退出的字元個數。如果這個變數存在,但是值不是一個數字或者沒有賦值,預設值是 10。 如果變數沒有定義, EOF 標誌著輸入的結束。
INPUTRC
readline 的啟動配置檔案,而不是預設的 ~/.inputrc (參見下面的 READLINE 章節)。
LANG
用來決定沒有特地用 LC_ 變數指定的語言環境項。
LC_ALL
這個變數超越了 LANG 和所有其他指定語言環境項的 LC_ 變數。
LC_COLLATE
這個變數決定了為路徑擴充套件的結果排序時的字母順序,決定了範圍表示式的行為, 等價類,和路徑擴充套件中的歸併順序以及模式匹配。
LC_CTYPE
這個變數決定了字元的解釋和路徑擴充套件以及模式匹配中字元類的行為。
LC_MESSAGES
這個變數決定了翻譯以 $ 前導的雙引號字串時的語言環境。
LC_NUMERIC
這個變數決定了格式化數字時的語言環境分類。
LINES
內建命令 select 用它來判斷輸出選擇列表時的列寬度。在收到 SIGWINCH 訊號時自動設定。
MAIL
如果這個引數設定為一個檔名,並且沒有設定環境變數 MAILPATH 的話, bash 將在這個檔案中通知使用者有郵件到達。
MAILCHECK
指定 bash 檢查郵件的頻率是多少,以秒為單位。預設值是 60 秒。需要檢查郵件的時候,shell 在顯示提示符之前將進行檢查。 如果取消它的定義,或者設定為並非大於等於零的數值,shell 將禁止郵件檢查。
MAILPATH
一個冒號分隔的檔名列表,從中檢查郵件。當郵件到達某個特殊檔案中時,輸出的特定訊息可以 透過將檔名與訊息以 `?' 分隔來指定。 在訊息的文字中, $_ 擴充套件為當前郵件檔案的檔名。例如:
MAILPATH='/var/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"'
Bash 為這個變數提供預設值,但是它使用的使用者郵件檔案的位置是系統相關的 (例如,/var/mail/ $USER)。
OPTERR
如果設定為 1, bash 顯示內建命令 getopts 產生的錯誤訊息 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。每次 shell 啟動時或者一個 shell 指令碼被執行時 OPTERR 被初始化為 1。
PATH
搜尋命令的路徑。它是一個冒號分割的目錄列表,shell 從中搜索命令 (參見下面的 命令執行(COMMAND EXECUTION) 段落)。預設的路徑是系統相關的,是由安裝 bash 的系統管理員設定的。通常它的值是 ``/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.''。
POSIXLY_CORRECT
如果 bash 啟動環境中有這個變數,它將在讀取啟動配置檔案之前進入 posix mode,就好像提供了 --posix 啟動引數一樣。如果 shell 執行過程中設定了它, bash 就啟用 posix mode,就好像執行了 set -o posix 命令一樣。
PROMPT_COMMAND
如果有定義,它的值將作為一個命令,每次顯示主提示符之前都會執行。
PS1
這個引數的值被擴充套件 (參見下面的 PROMPTING 提示符 段落),用作主提示符字串。預設值是 `` \s-\v\$ ''。
PS2
這個引數的值同 PS1 一起被擴充套件,用作次提示符字串。預設值是 `` > ''。
PS3
這個引數的值被用作內建命令 select 的提示符 (參見上面的 SHELL GRAMMAR 語法 章節)。
PS4
這個引數的值同 PS1 一起被擴充套件,在執行跟蹤中在 bash 顯示每個命令之前顯示。需要的話, PS4 的第一個字元會被複制多次,來指示 indirection 的層數。預設值是 `` + ''。
TIMEFORMAT
在字首 time 保留字的管道中,這個引數的值用作格式字串, 指定計時資訊如何顯示。字元 % 引入的轉義序列,被擴充套件為時間值 或其他資訊。轉義序列和它們的含義如下所示;括號中是可選的成分。
%%
一個字面上的 %
%[p][l]R
經歷的時間,以秒計算。
%[p][l]U
CPU 在使用者模式下執行的秒數。
%[p][l]S
CPU 在系統模式下執行的秒數。
%P
CPU 使用率,演算法是 (%U + %S) / %R。
可選的 p 是指定精度 (小數點後數字位數) 的數值。 如果是 0 就不輸出小數點或小數值。最多指定到小數點後三位; 如果 p 大於 3 就會被改為 3。如果沒有指定 p,預設使用 3。
可選的 l 指定了長格式,包含分鐘,格式是 MMmSS.FFs。 p 的值決定了是不是包含小數位。
如果沒有設定這個值,bash 假定它的值是 $'\nreal\t%3lR\nuser\t%3lU\nsys%3lS'。 如果它是空值,就不會顯示計時資訊。顯示格式字串的時候,會加上 一個前導的新行符。
TMOUT
如果設定為大於 0 的值, TMOUT 被當作內建命令 read 的預設超時 等待時間。如果等待終端輸入時, TMOUT 秒之後仍然沒有輸入, select 命令將終止。在互動的 shell 中,它的值被解釋為顯示了 主提示符之後等待輸入的秒數。如果經過這個秒數之後仍然沒有輸入, Bash 將退出。
auto_resume
這個變數控制了 shell 如何與使用者和作業控制互動。如果設定了這個變數, 一個不包含重定向的單個詞的簡單命令,將作為恢復被中斷的作業的指示。 不允許出現模稜兩可的情況;如果有多個作業都以這個詞起始,將恢復最近執行 的作業。在這種情形下,被中斷的作業的 name 是用於啟動它的命令列。如果值設定為 exact, 給出的字串必須精確匹配被中斷的作業名;如果設定為 substring, 給出的字串需要匹配被中斷的作業名的子串。值 substring 的功能與作業識別符號 %? 功能類似 (參見下面的 JOB CONTROL 作業控制 章節)。如果設定為任何其他值,給出的字串必須是被中斷的作業的字首; 這樣做與作業識別符號 % 功能類似。
histchars
兩到三個字元,控制著歷史擴充套件和分段 (tokenization,參見下面的 HISTORY EXPANSION 歷史擴充套件 章節)。第一個字元是 history expansion(歷史擴充套件) 字元, 這個字元表明了歷史擴充套件的開始,通常是 ` !'。 第二個字元是 quick substitution(快速替換) 字元, 它是重新執行上次輸入的命令,但將命令中的字串替換為另一個的簡寫, 預設是 ` ^'。可選的第三個字元是指示如果作為一個詞的開始,那麼 一行中剩餘字元是註釋。通常這個字元是 ` #'。歷史註釋字元使得 對一行中剩餘字元在歷史替換中被跳過。它不一定使 shell 直譯器將 這一行的剩餘部分當作註釋。

Arrays

Bash 提供了一維陣列變數。任何變數都可以作為一個數組;內建命令 declare 可以顯式地定義陣列。陣列的大小沒有上限,也沒有限制在連續對成員引用和 賦值時有什麼要求。陣列以整數為下標,從 0 開始。
如果變數賦值時使用語法 name[subscript]=value, 那麼就會自動建立陣列。 subscript 被當作一個算術表示式,結果必須是大於等於 0 的值。要顯式地定義一個數組,使用 declare -a name (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。也可以用 declare -a name[ subscript] 這時 subscript 被忽略。陣列變數的屬性可以用內建命令 declarereadonly 來指定。每個屬性對於所有陣列元素都有效。
陣列賦值可以使用複合賦值的方式,形式是 name=(value1 ... valuen),這裡每個 value 的形式都是 [ subscript]=stringstring 必須出現。如果出現了可選的括號和下標,將為這個下標賦值,否則 被賦值的元素的下標是語句中上一次賦值的下標加一。下標從 0 開始。 這個語法也被內建命令 declare 所接受。單獨的陣列元素可以用上面介紹的語法 name[subscript]=value 來賦值。
陣列的任何元素都可以用 ${ name[subscript]} 來引用。 花括號是必須的,以避免和路徑擴充套件衝突。如果 subscript@ 或是 *,它擴充套件為 name 的所有成員。 這兩種下標只有在雙引號中才不同。在雙引號中,${ name[*]} 擴充套件為一個詞, 由所有陣列成員的值組成,用特殊變數 IFS 的第一個字元分隔;${ name[@]} 將 name 的每個成員擴充套件為一個詞。 如果陣列沒有成員,${ name[@]} 擴充套件為空串。這種不同類似於特殊引數 *@ 的擴充套件 (參見上面的 Special Parameters 段落)。${# name[subscript]} 擴充套件為 ${ name[subscript]} 的長度。如果 subscript* 或者是 @,擴充套件結果是陣列中元素的個數。引用沒有下標陣列變數等價於 引用元素 0。
內建命令 unset 用於銷燬陣列。 unset name[ subscript] 將銷燬下標是 subscript 的元素。 unset name, 這裡 name 是一個數組,或者 unset name[subscript], 這裡 subscript* 或者是 @,將銷燬整個陣列。
內建命令 declare, local, 和 readonly 都能接受 -a 選項,從而指定一個數組。內建命令 read 可以接受 -a 選項,從標準輸入讀入一列詞來為陣列賦值。內建命令 setdeclare 使用一種可以重用為輸入的格式來顯示陣列元素。

擴充套件(EXPANSION)

命令列的擴充套件是在拆分成詞之後進行的。有七種型別的擴充套件: brace expansion(花括號擴充套件), tilde expansion(波浪線擴充套件), parameter and variable expansion(引數和變數擴充套件), command substitution(命令替換), arithmetic expansion(算術擴充套件), word splitting(詞的拆分), 和 pathname expansion(路徑擴充套件).
擴充套件的順序是:brace expansion, tilde expansion, parameter, variable 和 arithmetic expansion 還有 command substitution (按照從左到右的順序), word splitting, 最後是 pathname expansion.
還有一種附加的擴充套件: process subtitution (程序替換) 只有在支援它 的系統中有效。
只有 brace expansion, word splitting, 和 pathname expansion 在擴充套件前後的詞數會發生改變;其他擴充套件總是將一個詞擴充套件為一個詞。 唯一的例外是上面提到的 " $@" 和 "${name[@]}" (參見 PARAMETERS引數)。

Brace Expansion

Brace expansion 是一種可能產生任意字串的機制。這種機制類似於 pathname expansion, 但是並不需要存在相應的檔案。 花括號擴充套件的模式是一個可選的 preamble(前導字元), 後面跟著一系列逗號分隔的字串,包含在一對花括號中, 再後面是一個可選的 postscript(附言)。 前導被新增到花括號中的每個字串前面,附言被附加到每個結果字串之後, 從左到右進行擴充套件。
花括號擴充套件可以巢狀。擴充套件字串的結果沒有排序;而是保留了從左到右的順序。 例如, a {d,c,b}e 擴充套件為 `ade ace abe'。
花括號擴充套件是在任何其他擴充套件之前進行的,任何對其他擴充套件有特殊意義的字元 都保留在結果中。它是嚴格字面上的。 Bash 不會對擴充套件的上下文或花括號中的文字做任何語義上的解釋。
正確的花括號擴充套件必須包含沒有引用的左括號和右括號,以及至少一個沒有 引用的逗號。任何不正確的表示式都不會被改變。可以用反斜槓來引用 {, 來阻止將它們識別為花括號表示式的一部分。 為了避免與引數擴充套件衝突,字串 ${ 不被認為有效的組合。
這種結構通常用來簡寫字串的公共字首遠比上例中為長的情況,例如:
mkdir /usr/local/src/bash/{old,new,dist,bugs}
或者:
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
花括號擴充套件導致了與歷史版本的 sh 的一點不相容。在左括號或右括號作為詞的一部分出現時, sh 不會對它們進行特殊處理,會在輸出中保留它們。 Bash 將括號從花括號擴充套件結果的詞中刪除。例如,向 sh 輸入 file{1,2} 會導致不變的輸出。同樣的輸入在 bash 進行擴充套件之後,會輸出 file1 file2 . 如果需要同 sh 嚴格地保持相容,需要在啟動 bash 的時候使用 +B 選項,或者使用 set 命令加上 +B 選項來禁用花括號擴充套件 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。

Tilde Expansion

如果一個詞以沒有引用的波浪線字元 (` ~') 開始,所有 在第一個沒有引用的斜線 (`/') 之前的字元 (或者是這個詞的所有字元, 如果沒有沒引用的斜線的話) 都被認為是 tilde-prefix(波浪線字首)。 如果 tilde-prefix 中沒有被引用的字元,那麼波浪線之後的字串 被認為是 login name(登入名)。如果登入名是空字串,波浪線將 被替換為 shell 引數 HOME 的值。如果沒有定義 HOME, 將替換為執行此 shell 的使用者的個人目錄。否則,tilde-prefix 被替換為 與指定登入名相聯絡的個人目錄。
如果 tilde-prefix 是 `~+',將使用 shell 變數 PWD 的值來替換。如果 tilde-prefix 是 `~-',並且設定了 shell 變數 OLDPWD, 將使用這個變數值來替換。如果在 tilde-prefix 中,波浪線之後的字串 由一個數字 N 組成,字首可選的 `+' 或者 `-',那麼 tilde-prefix 將被替換為目錄棧中相應的元素,就是將 tilde-prefix 作為引數執行內建命令 dirs 顯示的結果。如果 tilde-prefix 中波浪線之後的字元是一個數字,沒有字首, 那麼就假定有一個 `+'。
如果登入名不合法,或者波浪線擴充套件失敗,這個詞將不會變化。
在變數賦值中,對於 := 之後的字串會立即檢查未引用的 tilde-prefix。 這種情況下,仍然會進行波浪線擴充套件。因此,可以使用帶波浪線的檔名來為 PATH, MAILPATH, 和 CDPATH 賦值,shell 將賦予擴充套件之後的值。

Parameter Expansion

字元 ` $' 引入了引數擴充套件,命令替換和算術擴充套件。要擴充套件的引數名或符號 可能包含在花括號中,花括號可選的,但是可以使得要擴充套件的變數不會與緊隨其後 的字符合並,成為新的名稱。
使用花括號的時候,匹配的右括號是第一個 ` }',並且它沒有被反斜槓引用 或包含在一個引用的字串中,也沒有包含在一個嵌入的算術擴充套件,命令替換 或是引數擴充套件中。
${parameter}
被替換為 parameter 的值。如果 parameter 是一個位置引數,並且數字多於一位時;或者當緊隨 parameter 之後有不屬於名稱一部分的字元時,都必須加上花括號。
如果 parameter 的第一個字元是一個感嘆號,將引進一層間接變數。 bash 使用以 parameter 的其餘部分為名的變數的值作為變數的名稱; 接下來新的變數被擴充套件,它的值用在隨後的替換當中,而不是使用 parameter 自身的值。這也稱為 indirect expansion(間接擴充套件). 例外情況是下面講到的 ${! prefix*}。
下面的每種情況中, word 都要經過波浪線擴充套件,引數擴充套件,命令替換和 算術擴充套件。如果不進行子字串擴充套件, bash 測試一個沒有定義或值為空的 引數;忽略冒號的結果是隻測試未定義的引數。
${parameter:-word}
Use Default Values(使用預設值)。如果 parameter 未定義或值為空,將替換為 word 的擴充套件。否則,將替換為 parameter 的值。
${parameter:=word}
Assign Default Values(賦預設值)。如果 parameter 未定義或值為空, word 的擴充套件將賦予 parameter. parameter 的值將被替換。位置引數和特殊引數不能用這種方式賦值。
${parameter:?word}
Display Error if Null or Unset(顯示錯誤,如果未定義或值為空)。如果 parameter 未定義或值為空, word (或一條資訊,如果 word 不存在) 的擴充套件將寫入到標準錯誤;shell 如果不是互動的,則將退出。否則, parameter 的值將被替換。
${parameter:+word}
Use Alternate Value(使用可選值)。如果 parameter 未定義或值為空,不會進行替換;否則將替換為 word 擴充套件後的值。
${parameter:offset}
${parameter:offset:length}
Substring Expansion(子字串擴充套件)。 擴充套件為 parameter 的最多 length 個字元,從 offset 指定的字元開始。如果忽略了 length,擴充套件為 parameter 的子字串, 從 offset 指定的字串開始。 lengthoffset 是算術表示式 (參見下面的 ARITHMETIC EVALUATION 算術求值 段落)。 length 必須是一個大於等於 0 的數值。如果 offset 求值結果小於 0, 值將當作從 parameter 的值的末尾算起的偏移量。如果 parameter@,結果是 length 個位置引數,從 offset 開始。 如果 parameter 是一個數組名,以 @ 或 * 索引,結果是陣列的 length 個成員,從 ${parameter[offset]} 開始。 子字串的下標是從 0 開始的,除非使用位置引數時,下標從 1 開始。
${!prefix*}
擴充套件為名稱以 prefix 開始的變數名,以特殊變數 IFS 的第一個字元分隔。
${#parameter}
替換為 parameter 的值的長度 (字元數目)。如果 parameter* 或者是 @, 替換的值是位置引數的個數。如果 parameter 是一個數組名,下標是 * 或者是 @, 替換的值是陣列中元素的個數。
${parameter#word}
${parameter##word}
word 被擴充套件為一個模式,就像路徑擴充套件中一樣。如果這個模式匹配 parameter 的值的起始,那麼擴充套件的結果是將 parameter 擴充套件後的值中,最短的匹配 (`` #'' 的情況) 或者最長的匹配 (`` ##''的情況) 刪除的結果。如果 parameter@ 或者是 *, 則模式刪除操作將依次施用於每個位置引數,最後擴充套件為結果的列表。如果 parameter 是一個數組變數,下標是 @ 或者是 *, 模式刪除將依次施用於陣列中的每個成員,最後擴充套件為結果的列表。
${parameter%word}
${parameter%%word}
word 被擴充套件為一個模式,就像路徑擴充套件中一樣。如果這個模式匹配 parameter 擴充套件後的值的尾部,那麼擴充套件的結果是將 parameter 擴充套件後的值中,最短的匹配 (`` %'' 的情況) 或者最長的匹配 (`` %%''的情況) 刪除的結果。如果 parameter@ 或者是 *, 則模式刪除操作將依次施用於每個位置引數,最後擴充套件為結果的列表。如果 parameter 是一個數組變數,下標是 @ 或者是 *, 模式刪除將依次施用於陣列中的每個成員,最後擴充套件為結果的列表。
${parameter/pattern/string}
${parameter//pattern/string}
patterm 被擴充套件為一個模式,就像路徑擴充套件中一樣。 parameter 被擴充套件,其值中最長的匹配 pattern 的內容被替換為 string。 在第一種形式中,只有第一個匹配被替換。第二種形式使得 pattern 中所有匹配都被替換為 string。 如果 pattern# 開始,它必須匹配 parameter 擴充套件後 值的首部。如果 pattern% 開始,它必須匹配 parameter 擴充套件後值的尾部。如果 string 是空值,pattern 的匹配都將被刪除, pattern 之後的 / 將被忽略。如果 parameter@ 或者是 *, 則替換操作將依次施用於每個位置引數,最後擴充套件為結果的列表。如果 parameter 是一個數組變數,下標是 @ 或者是 *, 模式刪除將依次施用於陣列中的每個成員,最後擴充套件為結果的列表。

Command Substitution

命令替換 ( Command substitution) 允許以命令的輸出替換命令名。有 兩種形式:
$(command)
還有
`command`
Bash 進行擴充套件的步驟是執行 command,以它的標準輸出替換它,並且將所有後續的 新行符刪除。內嵌的新行符不會刪除,但是它們可能會在詞的拆分中被刪除。 命令替換 $(cat file) 可以用等價但是更快的方法 $(< file) 代替。
當使用舊式的反引號 ("``") 替換形式時,反斜槓只有其字面意義,除非 後面是 $, `, 或者是 \. 第一個前面沒有反斜槓的反引號將結束命令替換。當使用 $( command) 形式時,括號中所有字元組成了整個命令;沒有被特殊處理的字元。
命令替換可以巢狀。要在使用反引號形式時巢狀,可以用反斜槓來轉義內層的 反引號。
如果替換髮生在雙引號之中,結果將不進行詞的拆分和路徑擴充套件。

Arithmetic Expansion

算術擴充套件允許算術表示式的求值和結果的替換。算術擴充套件的格式是:
$((expression))
表示式 expression 被視為如同在雙引號之中一樣,但是括號中的雙引號不會被特殊處理。 表示式中所有詞都經過了引數擴充套件,字串擴充套件,命令替換和引用的刪除。 算術替換可以巢狀。
求值根據下面 算術求值 (ARITHMETIC EVALUATION) 章節中列出的規則進行。如果表示式 expression 非法, bash 輸出錯誤提示訊息,不會進行替換。

Process Substitution

Process substitution (程序替換) 只有在支援命名管道 ( FIFOs), 或者支援使用 /dev/fd 方式為開啟的檔案命名的系統中才可用。 它的形式是 <(list) 或者是 >(list)。 程序 list 執行時的輸入或輸出被連線到一個 FIFO 或者 /dev/fd 中的檔案。檔案的名稱作為一個引數被傳遞到當前命令,作為擴充套件的結果。 如果使用 >(list) 形式,向檔案寫入相當於為 list 提供輸入。如果使用 <( list) 形式,可以讀作為引數傳遞 的檔案來獲得 list 的輸出。
如果可能的話,程序替換是與引數和變數擴充套件,命令替換和算術擴充套件同時發生的。

Word Splitting

shell 檢測不在雙引號引用中發生的引數擴充套件,命令替換和算術擴充套件的結果, 進行 word splitting(詞的拆分)。
shell 將 IFS 的每個字元都作為定界符,根據這些字元來將其他擴充套件的結果分成詞。如果 IFS 沒有定義,或者它的值是預設的 <space><tab><newline>, 那麼 IFS 字元的任何序列都將作為分界之用。如果 IFS 的值是預設之外的值,那麼詞開頭和結尾的空白字元 spacetab 都將被忽略,只要空白字元在 IFS 的值之內 (即, IFS 包含空白字元)。 任何在 IFS 之中但是不是 IFS 空白的字元,以及任何相鄰的 IFS 空白字元,將欄位分隔開來。 IFS 空白字元的序列也被作為分界符。如果 IFS 的值是空,不會發生詞的拆分。
顯式給出的空值引數 ( ""'') 將被保留。 隱含的空值引數,來自於空值的引數擴充套件,如果沒有引用則將被刪除。 如果空值的引數在雙引號引用中擴充套件,結果是空值的引數,將被保留。
注意如果沒有發生擴充套件,不會進行詞的拆分。

Pathname Expansion

詞的拆分之後,除非設定過 -f 選項, bash 搜尋每個詞,尋找字元 *, ?, 和 [. 如果找到了其中之一,那麼這個詞被當作一個 pattern(模式), 被替換為匹配這個模式的檔名以字母順序排列的列表。如果沒有找到匹配的檔名, 並且 shell 禁用了 nullglob 選項,這個詞將不發生變化。如果設定了 nullglob 選項並且沒有找到匹配,這個詞將被刪除。如果啟用了 nocaseglob 選項,匹配時將不考慮字母的大小寫。當模式用作路徑名擴充套件時,字元 ``.'' 如果在一個名稱的開始或者緊隨一個斜槓之後,那麼它必須被顯式地匹配,除非設定了 dotglob shell 選項。當匹配一個路徑名時,斜槓符必須被顯式地匹配。其他情況下,字元 ``.'' 不會被特殊對待。參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 中對 shopt 的介紹,其中有 shell 選項 nocaseglob, nullglob, 和 dotglob 的描述。
環境變數 GLOBIGNORE 可以用來限制匹配 pattern 的檔名集合。如果設定了 GLOBIGNORE, 每個匹配的檔名如果匹配 GLOBIGNORE 中任何一個模式的話將從匹配的列表中刪除。檔名 ``.''``..'' 總是被忽略,即使設定了 GLOBIGNORE。 但是,設定 GLOBIGNORE 和啟用 shell 選項 dotglob 效果是相同的,因此所有其他以 ``.'' 開頭的檔名將被匹配。要得到原來的行為 (忽略所有以 ``.'' 開頭的檔名),可以將 ``.*'' 新增為 GLOBIGNORE 的模式之一。選項 dotglob 被禁用,如果 GLOBIGNORE 沒有定義時。
Pattern Matching
任何模式中出現的字元,除了下面描述的特殊模式字元外,都匹配它本身。 模式中不能出現 NUL 字元。如果要匹配字面上的特殊模式字元,它必須被引用。
特殊模式字元有下述意義:
*
匹配任何字串包含空串。
?
匹配任何單個字元。
[...]
匹配所包含的任何字元之一。用一個連字元 (`-') 分隔的一對字元意思是一個 range expression (範圍表示式); 任何排在它們之間的字元,包含它們,都被匹配。 排序使用當前語言環境的字元順序和字符集。如果 [ 之後的第一個字元是一個 ! 或是一個 ^ 那麼任何不包含在內的字元將被匹配。範圍表示式中字元的順序是由當前語言環境 和環境變數 LC_COLLATE 的值 (如果設定了的話) 決定的。一個 - 只有作為集合中第一個或最後一個字元時才能被匹配。一個 ] 只有是集合中第一個字元時才能被匹配。
 
[] 中, character classes (字元類) 可以用 [:class:] 這樣的語法來指定,這裡 class 是在 POSIX.2 標準中定義的下列類名之一:
alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
 
一個字元類匹配任何屬於這一類的字元。 word 字元類匹配字母,數字和字元 _。
 
 
[] 中,可以用 [= c=] 這樣的語法來指定 equivalence class (等價類)。它匹配與字元 c 有相同歸併權值 (collation weight,由當前 語言環境定義) 的字元。
 
 
[] 中,語法 [.symbol.] 匹配歸併符號 (collating symbol) symbol
如果使用內建命令 shopt 啟用了 shell 選項 extglob, 將識別另外幾種模式匹配運算子。下面的描述中, pattern-list 是一個 或多個模式以 | 分隔的列表。複合的模式可以使用一個或多個下列的 子模式構造出來:
 
?(pattern-list)
匹配所給模式零次或一次出現
*(pattern-list)
匹配所給模式零次或多次出現
+(pattern-list)
匹配所給模式一次或多次出現
@(pattern-list)
準確匹配所給模式之一
!(pattern-list)
任何除了匹配所給模式之一的字串

Quote Removal

經過前面的擴充套件之後,所有未引用的字元 \, ', 以及並非上述擴充套件結果的字元 " 都被刪除。

重定向(REDIRECTION)

在命令執行前,它的輸入和輸出可能被 redirected (重定向), 使用一種 shell 可以解釋的特殊記法。重定向也可以用於為當前 shell 執行環境 開啟和關閉檔案。下列重定向運算子可以前置或者放在 simple command (簡單命令) 之中的任何位置,或者放在 command 之後。重定向是以出現的順序進行處理的,從左到右。
下列描述中,如果檔案描述符被忽略,並且第一個重定向運算子是 <, 那麼重定向指的是標準輸入 (檔案描述符是 0)。如果重定向運算子的第一個字元是 >, 那麼重定向指的是標準輸出 (檔案描述符是 1)。
下列描述中,重定向運算子之後的詞如果沒有特殊說明,都要經過 brace expansion, tilde expansion, parameter expansion, command substitution, arithmetic expansion, quote removal, pathname expansion, 還有 word splitting。如果擴充套件為多於一個詞, bash 將報錯。
注意重定向的順序非常重要。例如,命令
ls > dirlist 2>&1
將標準輸出和標準錯誤重定向到檔案 dirlist, 而命令
ls 2 >&1 > dirlist
只會將標準輸出重定向到檔案 dirlist, 因為在標準輸出被重定向到檔案 dirlist 中之前,標準錯誤被複製為標準輸出。
一些檔名在重定向中被 bash 特殊處理,如下表所示:
/dev/fd/fd
如果 fd 是一個合法的整數,檔案描述符 fd 將被複制。
/dev/stdin
檔案描述符 0 被複制。
/dev/stdout
檔案描述符 1 被複制。
/dev/stderr
檔案描述符 2 被複制。
/dev/tcp/host/port
如果 host 是一個合法的主機名或 Internet 地址,並且 port 是 一個整數埠號或服務名, bash 試圖建立與相應的 socket (套接字) 的 TCP 連線。
/dev/udp/host/port
如果 host 是一個合法的主機名或 Internet 地址,並且 port 是 一個整數埠號或服務名, bash 試圖建立與相應的 socket (套接字) 的 UDP 連線。
開啟或建立檔案錯誤將導致重定向出錯。

Redirecting Input

重定向輸入使得以 word 擴充套件結果為名的檔案被開啟並透過檔案描述符 n 讀取,如果沒有指定 n 那麼就作為標準輸入 (檔案描述符為 0) 讀取。
重定向輸入的一般形式是:
[ n]<word

Redirecting Output

重定向輸出使得以 word 擴充套件結果為名的檔案被開啟並透過檔案描述符 n 寫入,如果沒有指定 n 那麼就作為標準輸出 (檔案描述符為 1) 寫入。
重定向的一般形式是:
[ n]>word
如果重定向運算子是 >, 並且啟用了內建命令 setnoclobber 選項,那麼如果 word 擴充套件後得到的檔名存在並且是一個普通的檔案, 重定向將失敗。如果重定向運算子是 >|, 或者重定向運算子是 > 並且沒有啟用內建命令 setnoclobber 選項,那麼即使 word 得出的檔名存在,也會嘗試進行重定向。

Appending Redirected Output (新增到重定向後的輸出尾部)

這種方式的輸出重定向使得以 word 擴充套件結果為名的檔案被開啟並透過檔案描述符 n 從尾部新增。如果沒有指定 n 就使用標準輸出 (檔案描述符 1)。如果檔案不存在,它將被建立。
重定向的一般形式是:
[ n]>>word

Redirecting Standard Output and Standard Error

Bash 允許使用這種結構將標準輸出和標準錯誤 (檔案描述符 1 和 2) 重定向到以 word 擴充套件結果為名的檔案中。
有兩種重定向標準輸出/標準錯誤的形式:
&>word
還有
>&word
兩種形式中,推薦使用第一種。它與
>word 2>&1
在語義上等價。

Here Documents

這種重定向使得 shell 從當前原始檔讀取輸入,直到遇到僅包含 word 的一行 (並且沒有尾部空白,trailing blanks) 為止。直到這一點的所有行被用作 命令的標準輸入。
here-document 的格式是:
<<[-]word
         here-document
delimiter
不會對 word 進行 parameter expansion, command substitution, arithmetic expansion, 或者 pathname expansion。如果 word 中任何字元是引用的, delimiter 將是對 word 進行引用刪除的結果,here-document 中的行不會被擴充套件。如果 word 沒有被引用,here-documnet 中的所有行都要經過 parameter expansion, command substitution, 和 arithmetic expansion。 在後一種情況下,字元序列 \<newline> 被忽略;必須用 \ 來引用字元 \, $, 和 `.
如果重定向運算子是 <<-, 那麼所有前導的 tab 字元都被從輸入行和包含 delimiter 的行中刪除。這樣使得 shell 指令碼中的 here-document 可以被更好地縮排。

Here Strings

here-document 的變種,形式是
<<<word
word 被擴充套件,提供給命令作為標準輸入。

Duplicating File Descriptors (複製檔案描述符)

重定向運算子
[ n]<&word
用於複製檔案描述符。如果 word 擴充套件為一個或多個數字, n 代表的檔案描述符將成為那個檔案描述符的複製。如果 word 中的數字並未指定一個被用於讀取的檔案描述符,將產生一個重定向錯誤。如果 word 擴充套件為 -, 檔案描述符 n 將被關閉。如果沒有指定 n, 將使用標準輸入 (檔案描述符 0)。
類似的,運算子
[ n]>&word
用於複製輸出檔案描述符。如果沒有指定 n, 將使用標準輸出 (檔案描述符 1)。如果 word 中的數字並未指定一個被用於輸出的檔案描述符,將產生一個重定向錯誤。 特殊情況下,如果忽略了 n,並且 word 並非擴充套件為一個或多個數字, 標準輸出和標準錯誤將被重定向,和前面描述的一樣。

Moving File Descriptors

重定向運算子
[ n]<&digit-
將檔案描述符 digit 移動為檔案描述符 n, 或標準輸入 (檔案描述符 0),如果沒有指定 n 的話。 digit 複製為 n 之後就被關閉了。
類似的,重定向運算子
[ n]>&digit-
將檔案描述符 digit 移動為檔案描述符 n, 或標準輸出 (檔案描述符 1),如果沒有指定 n 的話。

Opening File Descriptors for Reading and Writing

重定向運算子
[ n]<>word
使得以 word 擴充套件結果為名的檔案被開啟,透過檔案描述符 n 進行讀寫。如果沒有指定 n 那麼就使用檔案描述符 0。如果檔案不存在,它將被建立。

別名(ALIASES)

Aliases (別名機制) 允許將一個詞來替換為一個字串,如果它是 一個簡單命令的第一個詞的話。shell 記錄著一個別名列表,可以使用 內建命令 aliasunalias 來定義和取消 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。每個命令的第一個詞,如果沒有引用,都將被檢查是否是一個別名。 如果是,這個詞將被它所指代的文字替換。別名和替換的文字可以包含任何有效 的 shell 輸入,包含上面列出的 metacharacters (元字元) ,特殊情況是別名中不能包含 =。替換文字的第一個詞也被檢查是否 是別名,但是如果它與被替換的別名相同,就不會再替換第二次。這意味著可以用 ls 作為 ls -F 的別名, bash 不會遞迴地展開替換文字。如果別名的最後一個字元是 blank, 那麼命令中別名之後的下一個詞也將被檢查是否能進行別名展開。
別名可以使用 alias 命令來建立或列舉出來,使用 unalias 命令來刪除。
在替換文字中沒有引數機制。如果需要引數,應當使用 shell 函式 (參見下面的 FUNCTIONS (函式) 段落)。
如果 shell 不是互動的,別名將不會展開,除非使用內建命令 shopt 設定了 expand_aliases 選項。
關於別名的定義和使用中的規則比較混亂。 Bash 在執行一行中的任何命令之前,總是讀入至少完整一行的輸入。 別名在命令被讀取時展開,而不是在執行的時候。因此,別名定義如果 和另一個命令在同一行,那麼不會起作用,除非讀入了下一行。 別名定義之後,同一行中的命令不會受新的別名影響。這種行為 在函式執行時存在爭議,因為別名替換是在函式定義被讀取時發生的, 而不是函式被執行的時候,因為函式定義本身是一個複合命令。結果, 在函式中定義的別名只有當這個函式執行完才會生效。為了保險起見, 應當總是將別名定義放在單獨的一行,不在複合命令中使用 alias。
不管什麼情況下,別名都被 shell 函式超越 (be superseded)。

函式(FUNCTIONS)

一個 shell 函式,以上面 SHELL GRAMMAR 中描述的方法定義,儲存著一系列的命令,等待稍後執行。 當 shell 函式名作為一個簡單命令名使用時,這個函式名關聯的命令的序列 被執行。函式在當前 shell 的上下文環境中執行;不會建立新的程序來 解釋它們 (這與 shell 指令碼的執行形成了對比)。當執行函式時,函式 的引數成為執行過程中的位置引數 (positional parameters)。特殊引數 # 被更新以反映這個變化。位置引數 0 不會改變。函式執行時, FUNCNAME 變數被設定為函式的名稱。函式和它的呼叫者在 shell 執行環境的所有 其他方面都是一樣的,特殊情況是 DEBUG 陷阱 (參見下面對內建函式 trap 的描述,在 shell 內建命令(SHELL BUILTIN COMMANDS) 章節中) 不會被繼承,除非函式設定了 trace 屬性 (參見下面對內建函式 declare 的描述)。
函式中的區域性變數可以使用內建命令 local 來宣告。通常情況下,變數和它們的值在函式和它的呼叫者之間是共享的。
如果函式中執行了內建命令 return, 那麼函式結束,執行從函式呼叫之後的下一個命令開始。 函式結束後,位置引數的值以及特殊引數 # 都將重置為它們在函式執行前的值。
函式名和定義可以使用內建命令 declaretypeset 加上 -f 引數來列出。如果在 declaretypeset 命令中使用 -F 選項將只列出函式名。函式可以使用內建命令 export 加上 -f 引數匯出,使得子 shell 中它們被自動定義。
函式可以是遞迴的。對於遞迴呼叫的次數沒有硬性限制。

算術求值("ARITHMETIC EVALUATION")

在一定的環境下,shell 允許進行算術表示式的求值 (參見內建命令 letArithmetic Expansion (算術表示式))。 求值使用固定寬度的整數,不檢查是否溢位,但是被零除會被捕獲,標記為錯誤。 運算元及其優先順序和聚合程度與 C 語言中相同。下列運算元的列表按照相同 優先順序的運算元其級別來分組。列出的級別順序是優先順序遞減的。
id++ id--
變數自增/自減 (在後)
++id --id
變數自增/自減 (在前)
- +
(單目的) 取負/取正
! ~
邏輯和位取反
**
乘冪
* / %
乘,除,取餘
+ -
加,減
<< >>
左/右位移
<= >= < >
比較
== !=
相等/不等
&
位與 (AND)
^
位異或 (exclusive OR)
|
位或 (OR)
&&
邏輯與 (AND)
||
邏輯或 (OR)
expr?expr:expr
條件求值
= *= /= %= += -= <<= >>= &= ^= |=
賦值
expr1 , expr2
逗號表示式
shell 變數可以作為運算元;在表示式求值之前會進行引數擴充套件。 在表示式中,可以用名稱引用 shell 變數,不必使用引數擴充套件的語法。 變數被引用時,其值被作為算術表示式來求值。 shell 變數用於表示式中時,不必啟用整數屬性。
以 0 為前導的常量被當作八進位制數,以 0x 或 0X 作為前導表明是十六進位制。 其他情況下,數字的形式是 [ base#]n,這裡 base 是一個 2 到 64 的十進位制數值,作為數字的基數, n 是在這個基數中數字的值。 如果忽略了 base#,將以 10 為基數。大於 10 的數字依次以小寫字母, 大寫字母,@ 和 _ 表示。如果 base 小於或等於 36,在表示 10 與 35 之間 的數字時小寫字母和大寫字母可以互換。
運算子根據優先順序順序進行求值。圓括號中的子表示式被最先求值,可能會 超越上面的優先順序規則。

條件表示式("CONDITIONAL EXPRESSIONS")

條件表示式用於 [[ 複合命令以及內建命令 test[ 中, 用來測試檔案屬性,進行字串和算術比較。表示式使用下面的單目或二進位制操作構造。 如果某操作的任何 file 引數的形式是 /dev/fd/n,那麼將檢查 檔案描述符 n。如果某操作的 file 引數是 /dev/stdin/dev/stdout 或者 /dev/stderr 之一,將分別檢查檔案描述符 0,1 和 2。
 
-a file
如果 file 存在則為真。
-b file
如果 file 存在且為塊裝置則為真。
-c file
如果 file 存在且為字元裝置則為真。
-d file
如果 file 存在且是一個目錄則為真。
-e file
如果 file 存在則為真。
-f file
如果 file 存在且為普通檔案則為真。
-g file
如果 file 存在且是設定組ID的 (sgid) 則為真。
-h file
如果 file 存在且為符號連結則為真。
-k file
如果 file 存在且設定了 ``sticky'' 位 (粘滯位) 則為真。
-p file
如果 file 存在且是一個命名管道 (FIFO) 則為真。
-r file
如果 file 存在且可讀則為真。
-s file
如果 file 存在且大小大於零則為真。
-t fd
如果檔案描述符 fd 是開啟的且對應一個終端則為真。
-u file
如果 file 存在且是設定使用者ID的 (suid) 則為真。
-w file
如果 file 存在且可寫則為真。
-x file
如果 file 存在且可執行則為真。
-O file
如果 file 存在且為有效使用者ID所擁有則為真。
-G file
如果 file 存在且為有效組ID所擁有則為真。
-L file
如果 file 存在且為符號連結則為真。
-S file
如果 file 存在且為套接字則為真。
-N file
如果 file 存在且上次讀取後被修改過則為真。
file1 -nt file2
如果 file1file2 要新 (根據修改日期),或者 如果 file1 存在而 file2 不存在,則為真。
file1 -ot file2
如果 file1file2 更舊,或者 如果 file1 不存在而 file2 存在,則為真。
file1 -ef file2
如果 file1file2 指的是相同的裝置和 inode 號則為真。
-o optname
如果啟用了 shell 選項 optname 則為真。參見下面對內建命令 set-o 選項的描述中的選項列表。
-z string
如果 string 的長度為 0 則為真。
-n string
string
如果 string 的長度非 0 則為真。
string1 == string2
如果字串相等則為真。= 可以用於使用 == 的場合來相容 POSIX 規範。
string1 != string2
如果字串不相等則為真。
string1 < string2
如果 string1 在當前語言環境的字典順序中排在 string2 之前則為真。
string1 > string2
如果 string1 在當前語言環境的字典順序中排在 string2 之後則為真。
arg1 OP arg2
OP-eq, -ne, -lt, -le, -gt, 或 -ge 之一。這些算術二進位制操作返回真,如果 arg1arg2 分別是 相等,不等,小於,小於或等於,大於,大於或等於關係。 Arg1arg2 可以是正/負整數。

簡單命令擴充套件("SIMPLE COMMAND EXPANSION")

當執行一個簡單命令時,shell 進行下列擴充套件,賦值和重定向,從左到右。
1.
直譯器標記為與變數賦值 (在命令名之前的) 和重定向有關的詞被儲存等待隨後處理。
2.
並非變數賦值或重定向的詞被擴充套件。如果擴充套件後仍然有詞保留下來,第一個詞被 作為命令名,其餘詞是引數。
3.
重定向按照上面 REDIRECTION 中講到的規則進行。
4.
每個變數賦值中 = 之後的文字在賦予變數之前要經過波浪線擴充套件, 引數擴充套件,命令替換,算術擴充套件和引用刪除。
如果沒有得到命令名,變數賦值影響當前 shell 環境。否則,變數被加入 被執行的命令的環境中,不影響當前 shell 環境。如果任何賦值動作試圖 為只讀變數賦值,將導致出錯,命令以非零狀態值退出。
如果沒有得到命令名,重定向仍會進行,但是不影響當前 shell 環境。 重定向出錯將使命令以非零狀態值退出。
如果擴充套件後有命令名保留下來,那麼執行過程如下所示。否則,命令退出。 如果在任何擴充套件中包含命令替換,那麼整個命令的退出狀態是最後一個命令 替換的退出狀態。如果沒有進行命令替換,命令以狀態零退出。

命令執行(COMMAND EXECUTION)

命令被拆分為詞之後,如果結果是一個簡單命令和可選的引數列表,將執行 下面的操作。
如果命令名中沒有斜槓,shell 試圖定位命令位置。如果存在同名的 shell 函式,函式將被執行,像上面 FUNCTIONS 中講到的一樣。如果名稱不是一個函式,shell 從 內建命令中搜索它。如果找到 對應命令,它將被執行。
如果名稱既不是 shell 函式也不是一個內建命令,並且沒有包含斜槓, bash 搜尋 PATH 的每個成員,查詢含有此檔名 (可執行檔案) 的目錄。 Bash 使用散列表來儲存可執行檔案的全路徑 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 中的 hash。 只有在散列表中沒有找到此命令,才對 PATH 進行完整的搜尋。如果搜尋不成功,shell 輸出錯誤訊息,返回退出狀態 127。
如果搜尋成功,或者命令中包含一個或多個斜槓,shell 在單獨的執行環境中 執行這個程式。引數 0 被設定為所給名稱;命令的其他引數被設定為所給的引數, 如果有的話。
如果執行失敗,因為檔案不是可執行格式,並且此檔案不是目錄,就假定它是 一個 shell script (指令碼),一個包含 shell 命令的檔案。此時將孵化 (spawn) 出一個子 shell 來執行它。子 shell 重新初始化自身,效果就好像是 執行了一個新的 shell 來處理指令碼一樣,但是父 shell 儲存的命令位置仍然被 保留 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 中的 hash)。
如果程式是以 #! 開頭的檔案,那麼第一行的其餘部分指定了這個程式的直譯器。 shell 執行指定的直譯器,如果作業系統不會自行處理這種可執行檔案格式的話。 直譯器的引數由下面三部分組成:程式第一行中直譯器名稱之後的可選的一個引數, 程式的名稱,命令列引數,如果有的話。

命令執行環境(COMMAND EXECUTION ENVIRONMENT)

shell 有 execution environment (執行環境) 的概念,由下列內容組成:
 
shell 啟動時繼承的開啟的檔案,例如在內建命令 exec 中使用重定向 修改的結果
當前工作目錄,使用 cdpushd 或者 popd 設定,或是由 shell 在啟動時繼承得到
檔案建立模式掩碼,使用 umask 設定或是從 shell 的父程序中繼承得到
當前陷阱,用 trap 設定
shell 引數,使用變數賦值或者 set 設定,或者是從父程序的環境中繼承得到
shell 函式,在執行中定義或者是從父程序的環境中繼承得到
設為允許的選項,在執行時設定 (要麼是預設允許的,要麼是命令列給出的) 或者是 用 set 設定
shopt 設為允許的選項
alias 定義的 shell 別名
各種程序號,包含後臺作業的程序號,$$ 的值,以及 $PPID 的值
當並非 shell 函式或內建命令的簡單命令執行時,它在一個由下述內容組成的 單獨的執行環境中啟動。除非另外說明,值都是從 shell 中繼承的。
 
shell 開啟的檔案,加上對命令使用重定向修改和新增的檔案
當前工作目錄
檔案建立模式掩碼
標記為匯出 (export) 的 shell 變數,以及傳遞到環境中為這個命令匯出的變數
shell 捕捉的陷阱被重置為從 shell 的父程序中繼承的值,shell 忽略的陷阱 也被忽略
在單獨的環境中啟動的命令不能影響 shell 的執行環境。
命令替換和非同步命令都在子 shell 環境中執行。子 shell 環境是原有 shell 環境的賦值,但 shell 捕捉的陷阱被重置為 shell 啟動時從父程序中繼承的值。 作為管道一部分來執行的內建命令也在一個子 shell 環境中執行。對子 shell 環境所作修改不能影響到原有 shell 的執行環境。
如果命令後面是 & 並且沒有啟用作業控制,命令的預設標準輸入將是空檔案 /dev/null。否則,被執行的命令從呼叫它的 shell 中繼承被重定向修改的 檔案描述符。

環境(ENVIRONMENT)

當一個程式執行時,它被賦予一個字串陣列,成為環境 environment。 它是一個 名稱-值對 ( name-value) 的列表,形式是 name=value.
shell 提供了多種操作環境的方法。啟動時,shell 掃描自身的環境,為每個找到 的名字建立一個引數,自動地將它標記為 export (向子程序匯出的)。被執行的命令繼承了這個環境。 exportdeclare -x 命令允許引數和函式被加入到環境中或從環境中刪除。如果環境中引數的值 被修改,新值成為環境的一部分,替換了舊值。所有被執行的命令繼承的環境 包含 shell 的初始環境 (可能值被修改過),減去被 unset 命令刪除的,加上透過 exportdeclare -x 命令新增的部分。
可以在任何 simple command 或函式的環境中設定暫時有效的引數,只要將引數賦值放在命令前面就可以了, 參見上面 PARAMETERS 的描述。這些賦值語句只在這個命令的環境中有效。
如果設定了內建命令 set-k 選項, 所有的 變數賦值都將放到命令的環境中,不僅是在命令名前面的那些。
bash 執行一個外部命令時,變數 _ 被設定為命令的檔案全名,然後被傳遞到命令的環境之中。

退出狀態("EXIT STATUS")

從 shell 的角度看,一個命令退出狀態是 0 意味著成功退出。 退出狀態是 0 表明成功。非零狀態值表明失敗。當命令收到 fatal signal N 退出時,bash 使用 128+ N 作為它的退出狀態。
如果沒有找到命令,為執行它而建立的子程序返回 127。如果找到了命令但是 檔案不可執行,返回狀態是 126。
如果命令由於擴充套件或重定向錯誤而失敗,退出狀態大於零。
shell 內建命令如果成功返回 0( true),執行時出錯則返回非零 ( false)。 所有內建命令返回 2 來指示不正確的用法。
Bash 自身返回最後執行的命令的退出狀態,除非發生了語法錯誤, 這時它返回非零值。參見下面的內建命令 exit

訊號(SIGNALS)

如果 bash 是互動的,沒有設定任何陷阱,它忽略 SIGTERM (這樣 kill 0 不會殺掉互動的 shell)。 SIGINT 被捕獲並處理 (從而使內建命令 wait 可以中斷)。在所有情況下, bash 忽略 SIGQUIT。 如果正在使用作業控制, bash 忽略 SIGTTIN, SIGTTOU, 和 SIGTSTP.
bash 開始的並行作業的訊號處理控制代碼都設定為 shell 從父程序中繼承 的值。如果不是正在使用作業控制,非同步命令還忽略 SIGINTSIGQUIT 。 作為命令替換結果執行的命令忽略鍵盤產生的作業控制訊號 SIGTTIN, SIGTTOU, 和 SIGTSTP.
如果收到訊號 SIGHUP, shell 預設退出。在退出前,互動的 shell 向所有作業,執行的或停止的,傳送 SIGHUP 訊號。shell 向停止的作業發出 SIGCONT 訊號來保證它們會收到 SIGHUP. 要阻止 shell 向特定的作業傳送訊號,應當使用內建命令 disown 將作業從作業表中刪除 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節) 或者使用 disown -h 來標記為不接受 SIGHUP。
如果使用 shopt 設定了 shell 選項 huponexit, 在互動的登入 shell 退出時 bash 向所有作業發出 SIGHUP 訊號。
bash 等待命令執行結束時,如果收到已設定了陷阱的訊號,陷阱 (trap) 將不會執行,直到命令結束。 當 bash 透過內建命令 wait 等待非同步命令時,如果收到已設定 了陷阱的訊號,將使得內建命令 wait 立即以大於 128 的狀態值返回。 接著,陷阱將立即被執行。

作業控制("JOB CONTROL")

Job control (作業控制) 指的是可以選擇停止 ( suspend,掛起) 程序執行,並且 可以在之後繼續 ( resume,恢復) 執行的能力。使用者一般在互動的人機介面 中使用這種功能。介面是由系統的終端驅動和 bash 共同提供的。
shell 將每個管道分配給一個 作業(job)。 它儲存一個當前執行的作業表,可以用 jobs 命令來列出。當 bash 啟動一個非同步的作業時 (background,後臺執行), 它輸出這樣的一行:
[1] 25647
表明這個作業的作業號是 1,與作業相關連的管道中最後一個程序的 程序ID是 15647。管道中所有程序都是同一個作業的成員。 Bash 使用 作業(job) 概念作為作業控制的基礎。
為簡化作業控制的使用者介面的實現,作業系統負責管理“當前終端的程序組” ( current terminal process group ID) 的概念。這個程序組的成員 (程序組 ID 是當前終端程序組 ID 的程序) 可以收到鍵盤產生的訊號,例如 SIGINT. 這些程序被稱為 foreground(前臺的)。 Background (後臺的) 程序是那些程序組 ID 與終端不同的程序;這些程序不會收到鍵盤產生的訊號。 只有前臺程序可以從終端讀或向終端寫。後臺程序試圖讀/寫終端時,將收到終端驅動程式傳送的 SIGTTIN (SIGTTOU) 訊號。這個訊號如果沒有加以捕捉,將掛起這個程序。
如果 bash 執行其上的作業系統支援作業控制, bash 會包含使用它的設施。在一個程序正在執行的時候鍵入 suspend 掛起 字元 (通常是 ^Z, Control-Z) 將使這個程序暫停,將控制權還給 bash. 輸入 delayed suspend , 延時掛起 字元 (通常是 ^Y, Control-Y) 將使這個程序在試圖從終端讀取輸入時暫停,將控制權還給 bash. 使用者接下來可以控制此作業的狀態,使用 bg 命令使它在後臺繼續執行, fg 命令使它在前臺繼續執行,或 kill 命令將它殺死。 ^Z 會立即起作用,並且還有使等待中的 (pending) 輸出和輸入被忽略的附加副作用。
有很多方法來指代 shell 中的作業。字元 % 可以引入作業名。編號為 n 的作業可以用 %n 的形式來指代。作業也可以用啟動它的名稱的字首,或者命令列中的子字串來指代。例如, %ce 指代一個暫停的 ce 作業。如果字首匹配多於一個作業, bash 報錯。另一方面,使用 %?ce, 可以指代任何命令列中包含字串 ce 的作業。如果子字串匹配多於一個作業, bash 報錯。符號 %%%+ 指代 shell 意義上的 current job,當前作業, 也就是前臺被暫停的最後一個作業,或者是在後臺啟動的作業。 previous job ,前一作業 可以使用 %- 來指代。在有關作業的輸出資訊中 (例如,命令 jobs 的輸出),當前作業總是被標記為 +, 前一作業標記為 -.
簡單地給出作業名,可以用來把它放到前臺: %1``fg %1'' 的同義詞,將作業 1 從後臺放到前臺。類似的, ``%1 &'' 在後臺恢復作業 1,與 ``bg %1'' 等價。
當某個作業改變狀態時,shell 立即可以得知。通常, bash 等待直到要輸出一個提示符時,才會報告作業的狀態變化,從而不會打斷其他輸出。 如果啟用了內建命令 set-b 選項, bash 將立即報告這些變化。對 SIGCHLD 訊號的陷阱將在每個子程序退出時執行。
如果在作業暫停時試圖退出 bash, shell 列印一條警告訊息。命令 jobs 可能被用來檢查作業的狀態。如果再次試圖退出,中間沒有其他命令,shell 不會列印 其他警告,暫停的作業將終止。

提示符(PROMPTING)

在互動執行時, bash 在準備好讀入一條命令時顯示主提示符 PS1, 在需要更多的輸入來完成一條命令時顯示 PS2。 Bash 允許透過插入一些反斜槓轉義的特殊字元來定製這些提示字串,這些字元被如下解釋:
\a
一個 ASCII 響鈴字元 (07)
\d
日期,格式是 "星期 月份 日" (例如,"Tue May 26")
\D{format}
format 被傳遞給 strftime(3),結果被插入到提示字串中; 空的 format 將使用語言環境特定的時間格式。花括號是必需的
\e
一個 ASCII 跳脫字元 (033)
\h
主機名,第一個 `.' 之前的部分
\H
主機名
\j
shell 當前管理的作業數量
\l
shell 的終端裝置名的基本部分
\n
新行符
\r
回車
\s
shell 的名稱, $0 的基本部分 (最後一個斜槓後面的部分)
\t
當前時間,採用 24小時制的 HH:MM:SS 格式
\T
當前時間,採用 12小時制的 HH:MM:SS 格式
\@
當前時間,採用 12小時制上午/下午 (am/pm) 格式
\A
當前時間,採用 24小時制上午/下午格式
\u
當前使用者的使用者名稱 the username of the current user
\v
bash 的版本 (例如,2.00)
\V
bash 的發行編號,版本號加補丁級別 (例如,2.00.0)
\w
當前工作目錄
\W
當前工作目錄的基本部分
\!
此命令的歷史編號
\#
此命令的命令編號
\$
如果有效 UID 是 0,就是 #, 其他情況下是 $
\nnn
對應八進位制數 nnn 的字元
\\
一個反斜槓
\[
一個不可列印字元序列的開始,可以用於在提示符中嵌入終端控制序列
\]
一個不可列印字元序列的結束
命令編號和歷史編號通常是不同的:歷史編號是命令在歷史列表中的位置,可能 包含從歷史檔案中恢復的命令 (參見下面的 HISTORY 歷史 章節),而命令編號是當前 shell 會話中執行的命令序列中,命令的位置。 字串被解碼之後,它將進行擴充套件,要經過 parameter expansion, command substitution, arithmetic expansion 和 quote removal, 最後要經過 shell 選項 promptvars 處理 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節中,對命令 shopt 的描述)。

readline庫(READLINE)

這是在互動 shell 中處理讀取輸入的庫,除非在 shell 啟動時給出了 --noediting 選項。預設情況下,行編輯命令類似於 emacs 中的那些。也可以使用 vi 樣式的行編輯介面。 要在 shell 執行之後關閉行編輯,使用內建命令 set+o emacs+o vi 選項 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。

Readline Notation

在這個小節中,將使用 emacs 樣式的記法來表述按鍵。Ctrl 鍵記為 C- key, 例如,C-n 意思是 Ctrl-N。類似的, meta 鍵記為 M- key,因此 M-x 意味著 Meta-x。(在沒有 meta 鍵的鍵盤上,M- x 意思是 ESC- x,也就是說,按下 Esc 鍵,然後按 x 鍵。這使得 Esc 成為 meta prefix。M-C- x 的組合意思是 Esc-Ctrl- x, 也就是按 Esc 鍵,然後按住 Ctrl 鍵,同時按 x 鍵。)
readline 命令可以有數字的 引數(arguments), 一般作為重複的計數。有些時候,它是重要引數的標記。給向前方進行的命令 (例如, kill-line) 傳遞負數引數,將使得命令向反方向進行。 下面的命令如果接受引數時的行為與此不同,將另行說明。
當命令被描述為剪下 ( killing) 文字時,被刪除的文字被儲存,等待將來使用 (貼上, yanking)。被剪下的文字儲存在 kill ring 中。連續的剪下使得 文字被依次加入到一個單元中,可以一次被貼上。不剪下文字的命令將 kill ring 中的文字分離。

Readline Initialization 初始化

readline 可以透過將命令放入初始化檔案 ( inputrc 檔案) 來定製。 檔名從變數 INPUTRC 的值中獲取。如果沒有設定這個變數,預設是 ~/.inputrc. 當使用 readline 庫的程式啟動時,將讀取初始化檔案,按鍵關聯和變數將被設定。 readline 初始化檔案中只允許有很少的基本構造。 空行被忽略。以 # 開始的行是註釋。以 $ 開始的行指示了有條件的構造。 其他行表示按鍵關聯和變數設定。
預設的按鍵關聯可以使用 inputrc 檔案改變。其他使用這個庫的程式可以新增它們自己的命令和關聯。
例如,將
M-Control-u: universal-argument
C-Meta-u: universal-argument
放入 inputrc 將使得 M-C-u 執行 readline 命令 universal-argument.
可以識別下列字元的符號名稱: RUBOUT, DEL, ESC, LFD, NEWLINE, RET, RETURN, SPC, SPACE, 和 TAB.
在命令名之外,readline 允許將按鍵與一個字串關聯,當按下這個鍵時,將插入這個字串 (一個宏, macro)。

Readline Key Bindings

inputrc 檔案中的控制按鍵關聯的語法非常簡單。需要的內容是命令名或宏,以及它應當關聯到的按鍵序列。 名稱可以以兩種方式指定:一個按鍵的符號名稱,可能帶有 Meta-Control- 字首,或者是一個按鍵序列。
當使用 keyname:function-namemacro 形式時, keyname 是按鍵以英文拼寫的名稱。例如:
 
Control-u: universal-argument
 
Meta-Rubout: backward-kill-word
 
Control-o: "> output"
在上述例子中, C-u 被關聯到函式 universal-argument, M-DEL 被關聯到函式 backward-kill-word, 而 C-o 被關聯為執行右邊給出的宏 (意思是,將向行中插入 ``> output'' )。
在第二種形式中, "keyseq": function-namemacrokeyseq 不同於上面的 keyname, 表示整個按鍵序列的字串可以透過將按鍵序列放在雙引號引用中來指定。 可以使用一些 GNU Emacs 樣式的按鍵序列,如下例所示,但是不會識別按鍵的符號名稱。
 
"\C-u": universal-argument
 
"\C-x\C-r": re-read-init-file
 
"\e[11~": "Function Key 1"
在上述例子中, C-u 被又一次關聯到函式 universal-argument. C-x C-r 被關聯到函式 re-read-init-file, 而 ESC [ 1 1 ~ 被關聯為插入文字 ``Function Key 1''.
GNU Emacs 樣式的轉義序列的全集為:
\C-
Ctrl 字首
\M-
Meta 字首
\e
一個 Esc 字元
\\
反斜槓
\"
字面上的 "
\'
字面上的 '
除了 GNU Emacs 樣式的轉義序列,還有一系列反斜槓轉義序列可用:
\a
響鈴
\b
回退
\d
刪除
\f
進紙
\n
新行符
\r
回車
\t
水平跳格
\v
豎直跳格
\nnn
一個八位元字元,它的值是八進位制值 nnn (一到三個八進位制數字)。
\xHH
一個八位元字元,它的值是十六進位制值 HH (一到兩個十六進位制數字)。
輸入宏的文字時,必須使用單引號或雙引號引用來表明是宏的定義。 沒有引用的文字被當作函式名。在宏的定義體中,上述反斜槓轉義被擴充套件。 反斜槓將引用宏文字中所有其他字元,包括 " 和 '。
Bash 允許使用內建命令 bind 來顯示和修改當前 readline 按鍵關聯。在互動使用中可以用內建命令 set-o 選項切換到編輯模式 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。

Readline Variables

readline 包含額外的可用於定製它的行為的變數。可以在 inputrc 檔案中設定變數,使用如下形式的語句:
set variable-name value
除非另外說明,readline 變數的值總是 OnOff。 變數和它們的預設值是:
bell-style (audible)
控制了當 readline 需要鳴終端響鈴時的動作。如果設定為 none, readline 不會鳴鈴。如果設定為 visible,readline 使用可視的響鈴,如果可用的話。 如果設定為 audible,readline 試著鳴終端響鈴。
comment-begin (``#'')
這個字串在執行 readline 命令 insert-comment 時被插入。這個命令在 emacs 模式下被關聯為 M-#, 在 vi 模式下是 #。
completion-ignore-case (Off)
如果設定為 On,readline 進行大小寫不敏感的檔名匹配和補全。
completion-query-items (100)
這個變數決定著何時向用戶詢問,是否檢視由命令 possible-completions 產生的可能的補全數量。 它可以設為任何大於或等於 0 的值。如果可能的補全數量大於或等於這個變數的值, 使用者將被提示是否願意檢視它們;否則將直接在終端上列出它們。
convert-meta (On)
如果設定為 On,readline 將把設定了最高位的字元轉換為 ASCII 按鍵序列,方法是 去掉第八位,字首一個跳脫字元 (實際上,使用 Esc 作為轉義符 meta prefix)。
disable-completion (Off)
如果設定為 On,readline 將禁止詞的補全。補全字元將被插入到行中,就好像它們被 對映為 self-insert
editing-mode (emacs)
控制 readline 的按鍵關聯集合與 emacs 還是 vi 相似。 editing-mode 可以設定為 emacsvi。
enable-keypad (Off)
如果設定為 On ,readline 在呼叫時將試圖啟用輔助鍵盤。 一些系統需要設定這個來啟用方向鍵。
expand-tilde (Off)
如果設定為 On,readline 試圖進行詞的補全時會進行波浪線擴充套件。
history-preserve-point
如果設定為 On,歷史程式碼試著在 previous-historynext-history 取回的每個歷史行的相同位置中加點。
horizontal-scroll-mode (Off)
如果設定為 On,將使得 readline 使用單行來顯示,如果它比螢幕寬度要長,就在 單一的螢幕行上水平滾動輸入行,而不是自動迴繞到新行。
input-meta (Off)
如果設定為 On,readline 將允許八位元輸入 (也就是說,它不會將它讀入的字元中最高位刪除), 不管它能支援什麼樣的終端要求。名稱 meta-flag 與此變數同義。
isearch-terminators (``C-[C-J'')
用於終止增量的搜尋,不再將字元當作命令執行的字串。 如果這個變數沒有賦值,字串 EscC-J 將終止增量的搜尋。
keymap (emacs)
設定當前 readline 鍵盤對映。有效的鍵盤對映名稱是 emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-command,還有 vi-insert。 vi 等價於 vi-command; emacs 等價於 emacs-standard。預設值是 emacs; editing-mode 的值也會影響預設的鍵盤對映。
mark-directories (On)
如果設定為 On,補全的目錄名會新增一個斜槓。
mark-modified-lines (Off)
如果設定為 On,已被修改的歷史行將顯示為字首一個星號 ( *)。
mark-symlinked-directories (Off)
如果設定為 On,補全的名稱如果是到目錄的符號連結,則將新增一個斜槓 (與 mark-directories 的值同樣處理)。
match-hidden-files (On)
這個變數,如果設定為 On,將使得 readline 在進行檔名補全時,匹配以 `.' 開頭的檔案 (隱藏檔案), 除非使用者在要補全的檔名中給出了前導的 `.'。
output-meta (Off)
如果設定為 On,readline 將直接顯示設定了第八位的字元,而不是轉化為一個帶 meta 字首的轉義序列。
page-completions (On)
如果設定為 On,readline 將使用內建的類似 more 的分頁程式, 來每次顯示一屏可能的補全。
print-completions-horizontally (Off)
如果設定為 On,readline 將匹配的補全按字母表順序排序,然後水平排列顯示出來, 而不是在螢幕上豎直排列顯示。
show-all-if-ambiguous (Off)
這將調整補全函式的預設行為。如果設定為 on, 擁有多於一個可能的補全的詞將立即列出所有匹配,而不是鳴響鈴。
visible-stats (Off)
如果設定為 On,在列出可能的補全時,將在檔名後面新增一個表示檔案型別的字元, 檔案型別由 stat(2) 報告。

Readline Conditional Constructs

readline 實現了一種功能,本質上與 C 預處理器進行條件編譯的功能類似, 允許根據測試的結果進行鍵盤關聯和變數設定。其中使用了四種直譯器指令。
$if
$if 結構允許根據編輯模式,正在使用的終端,使用 readline 的應用程式來設定按鍵關聯。 測試的文字包括一行,直到行尾;不必用字元來隔離它。
mode
$if 結構的 mode= 形式用於測試 readline 處於 emacs 還是 vi 模式。 這可以與命令 set keymap 結合使用,例如,設定 emacs-standardemacs-ctlx 鍵盤對映,僅當 readline 以 emacs 模式啟動。
term
term= 形式用於包含與終端相關的按鍵關聯,也許是將按鍵序列輸出與終端的功能鍵相關聯。 等號 = 右邊的詞被同終端的全名和名稱中第一個 - 前面的一部分相比較。 例如,允許 sun 同時匹配 sunsun-cmd。
application
application 結構用於包含應用程式相關的設定。每個使用 readline 的程式都設定 application name, 初始化檔案可以測試它的值。它可用於將一個按鍵序列與對特定的程式有用的功能相關聯。 例如,下列命令添加了一個按鍵序列,用以引用 bash 中當前的詞或前一個詞
$if Bash
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
$endif
$endif
上例中的這個命令,結束了一個 $if 命令。
$else
如果測試失敗,$if 指令中這個分支的命令將被執行。
$include
這個指令使用單個檔名作為引數,從檔案中讀取命令和按鍵關聯。例如,下列指令 將讀取 /etc/inputrc
$include  /etc/inputrc

Searching

readline 提供了從命令歷史中搜索包含給定字串的行的命令 (參見下面的 HISTORY 歷史 章節)。有兩種搜尋模式: incrementalnon-incremental.
增量的搜尋在使用者結束輸入搜尋字串時開始。在搜尋字串的每個字元被輸入的同時, readline 顯示與已輸入的字串匹配的下一個歷史條目。 增量的搜尋只要求輸入能找到期望的歷史條目所需的那麼多字元。 isearch-terminators 變數中的字元用來終止一次增量的搜尋。如果 這個變數沒有被賦值,Esc 和 Ctrl-J 字串將結束一次增量的搜尋。 Ctrl-G 將取消一次增量的搜尋,恢復初始的行。當搜尋終止時,包含搜尋字串 的歷史條目成為當前行。
要從歷史列表中找到其他匹配的條目,適當地鍵入 Ctrl-S 或 Ctrl-R。 這樣將在歷史中向前/向後搜尋下一個匹配已輸入的搜尋字串的條目。 其他關聯到某個 readline 命令的按鍵序列將終止搜尋並執行關聯的命令。 例如, newline 將終止搜尋,接受當前行,從而執行歷史列表中的命令。
readline 可以記住上次增量搜尋的字串。如果鍵入兩次 Ctrl-R,中間沒有 輸入任何字元來定義一個新的搜尋字串,那麼將使用已記住的搜尋字串。
非增量的搜尋將整個搜尋字串讀入,然後才開始搜尋匹配的歷史條目。 搜尋字串可以由使用者輸入,或者是當前行的內容的一部分。

Readline Command Names

下面列出的是命令的名稱以及預設情況下它們關聯的按鍵序列。 命令名稱如果沒有對應的按鍵序列,那麼預設是沒有關聯的。在下列描述中, 點 ( point) 指當前游標位置,標記 ( mark) 指命令 set-mark 儲存的游標位置。point 和 mark 之間的文字被稱為範圍 ( region)。

Commands for Moving 移動

beginning-of-line (C-a)
移動到當前行的開始。
end-of-line (C-e)
移動到當前行的結尾。
forward-char (C-f)
向前移動一字。
backward-char (C-b)
向後移動一字。
forward-word (M-f)
向前移動到下一詞尾。詞由字元 (字母和數字) 組成。
backward-word (M-b)
向後移動到當前或上一詞首。
clear-screen (C-l)
清除螢幕,保留當前行在螢幕頂端。有引數時,重新整理當前行,不清屏。
redraw-current-line
重新整理當前行。

Commands for Manipulating the History 操縱歷史行

accept-line (Newline, Return)
接受這一行,不管游標在什麼位置。如果行非空,將根據變數 HISTCONTROL 的狀態加入到歷史列表中。如果行是修改過的歷史行,將恢復該歷史行到初始狀態。
previous-history (C-p)
從歷史列表中取得前一個命令,從列表中向後移動。
next-history (C-n)
從歷史列表中取得後一個命令,從列表中向前移動。
beginning-of-history (M-<)
移動到歷史中的第一行。
end-of-history (M->)
移動到輸入歷史行的末尾,也就是當前輸入的行的末尾。
reverse-search-history (C-r)
從當前行開始向後搜尋,按照需要在歷史中向“上”移動。這是一個增量的搜尋。
forward-search-history (C-s)
從當前行開始向前搜尋,按照需要在歷史中向“下”移動。這是一個增量的搜尋。
non-incremental-reverse-search-history (M-p)
從當前行開始向後,使用非增量搜尋來查詢使用者給出的字串。
non-incremental-forward-search-history (M-n)
從當前行開始向前,使用非增量搜尋來查詢使用者給出的字串。
history-search-forward
從當前行開始向前搜尋歷史,查詢從當前行首到 point 之間的字串。 這是一個非增量的搜尋。
history-search-backward
從當前行開始向後搜尋歷史,查詢從當前行首到 point 之間的字串。 這是一個非增量的搜尋。
yank-nth-arg (M-C-y)
將前一個命令的第一個引數 (通常是上一行的第二個詞) 插入到 point 位置。有引數 n 時,將前一個命令的第 n 個詞 (前一個命令中的詞從 0 開始計數) 插入到 point 位置。負數引數則插入前一個命令倒數第 n 個詞。
yank-last-arg (M-., M-_)
插入前一個命令的最後一個引數 (上一歷史條目的最後一個詞)。有引數時, 行為類似於 yank-nth-arg。後繼的 yank-last-arg 呼叫將 從歷史列表中向後移動,依次將每行的最後一個引數插入。
shell-expand-line (M-C-e)
擴充套件行,像 shell 做的那樣。其中包含別名和歷史擴充套件,還有所有的 shell 詞的擴充套件。 參見下面的 HISTORY EXPANSION 中關於歷史擴充套件的描述。
history-expand-line (M-^)
在當前行進行歷史擴充套件。參見下面的 HISTORY EXPANSION 中關於歷史擴充套件的描述。
magic-space
在當前行進行歷史擴充套件,並插入一個空格。參見下面的 HISTORY EXPANSION 中關於歷史擴充套件的描述。
alias-expand-line
在當前行進行別名擴充套件,參見上面的 ALIASES 中關於別名擴充套件的描述。
history-and-alias-expand-line
在當前行進行歷史和別名擴充套件。
insert-last-argument (M-., M-_)
yank-last-arg 同義。
operate-and-get-next (C-o)
接受當前行,加以執行,從歷史中取出相對當前行的下一行進行編輯。 任何引數都被忽略。
edit-and-execute-command (C-xC-e)
啟動一個編輯器,編輯當前命令列,將結果作為 shell 命令執行。 Bash 將依次試著執行 $FCEDIT, $EDITOR, 和 emacs 作為編輯器。

Commands for Changing Text 改變文字

delete-char (C-d)
刪除 point 處的字元。如果 point 在行首,行中沒有字元,最後一次輸入的字元 沒有被關聯到 delete-char,將返回 EOF.
backward-delete-char (Rubout)
刪除游標之後的字元。當給出一個數值的引數時,儲存刪除的文字到 kill ring 中。
forward-backward-delete-char
刪除游標下的字元,除非游標在行尾,此時刪除游標後的字元。
quoted-insert (C-q, C-v)
將輸入的下一字元保持原樣新增到行中。例如,可以用它來插入類似 C-q 的字元。
tab-insert (C-v TAB)
插入一個跳格符號。
self-insert (a, b, A, 1, !, ...)
插入鍵入的字元。
transpose-chars (C-t)
將 point 之前的字元向前移動,越過 point 處的字元,同時也改變 point 的位置。 如果 point 在行尾,將調換 point 之前的兩個字元。負數引數沒有作用。
transpose-words (M-t)
將 point 之前的詞向前移動,越過 point 處的詞,同時也改變 point 的位置。 如果 point 在行尾,將調換行中的最後兩個詞。
upcase-word (M-u)
將當前 (或下一個) 詞變成全大寫。有負值的引數時,將前一個詞變為大寫, 但是不移動 point。
downcase-word (M-l)
將當前 (或下一個) 詞變成全小寫。有負值的引數時,將前一個詞變為小寫, 但是不移動 point。
capitalize-word (M-c)
將當前 (或下一個) 詞變為首字大寫。有負值的引數時,將前一個詞變為首字大寫, 但是不移動 point。
overwrite-mode
控制插入/改寫模式。給出一個正整數引數時,切換為改寫模式。給出一個非正數 引數時,切換為插入模式。這個命令隻影響 emacs 模式;vi 模式 的改寫與此不同。每個對 readline() 的呼叫都以插入模式開始。在改寫模式下, 關聯到 self-insert 的字元替換 point 處的字元,而不是將它推到右邊。 關聯到 backward-delete-char 的字元以空格替換 point 前的字元。 預設情況下,這個命令沒有關聯。

Killing and Yanking 剪下和貼上

kill-line (C-k)
剪下從 point 到行尾的文字。
backward-kill-line (C-x Rubout)
反向剪下到行首。
unix-line-discard (C-u)
反向剪下到行首。與 backward-kill-line 沒有什麼區別。 剪下的文字被保存於 kill-ring 中。
kill-whole-line
剪切當前行中所有字元,不管 point 在什麼位置。
kill-word (M-d)
剪下從 point 到當前詞尾,或者如果 point 在詞之間,那麼剪下到下一詞尾。
backward-kill-word (M-Rubout)
剪下 point 之後的詞。詞的邊界與 backward-word 使用的相同。
unix-word-rubout (C-w)
剪下 point 之後的詞,使用空白作為詞的邊界。剪下的文字被保存於 kill-ring 中。
delete-horizontal-space (M-\)
刪除 point 兩邊的所有空格和跳格。
kill-region
剪切當前 region 的文字。
copy-region-as-kill
將 region 的文字複製到剪下緩衝區中。
copy-backward-word
將 point 前面的詞複製到剪下緩衝區中。 詞的邊界與 backward-word 使用的相同。
copy-forward-word
將 point 之後的詞複製到剪下緩衝區中。 詞的邊界與 backward-word 使用的相同。
yank (C-y)
將 kill-ring 頂部的內容貼上到 point 處的緩衝區中
yank-pop (M-y)
輪轉 kill-ring,貼上新的頂部內容。只能在 yankyank-pop 之後使用。

Numeric Arguments 數值引數

digit-argument (M-0, M-1, ..., M--)
將這個數字加入已有的 (already accumulating) 引數中,或者開始新的引數。 M-- 開始一個否定的引數。
universal-argument
這是指定引數的另一種方法。如果這個命令後面跟著一個或多個數字, 可能還包含前導的負號,這些數字定義了引數。如果命令之後跟隨著數字,再次執行 universal-argument 將結束數字引數,但是其他情況下被忽略。有一種特殊情況,如果命令之後緊接著 一個並非數字或負號的字元,下一命令的引數計數將乘以 4。 引數計數初始是 1,因此第一次執行這個函式,使得引數計數為 4, 第二次執行使得引數計數為 16,以此類推。

Completing 補全

complete (TAB)
試著對 point 之前的文字進行補全。 Bash 依次試著將文字作為一個變數 (如果文字以 $ 開始),一個使用者名稱 (如果文字以 ~ 開始),主機名 (如果文字以 @ 開始),或者命令 (以及別名和函式) 來補全。如果這些都沒有匹配,將嘗試檔名補全。
possible-completions (M-?)
列出 point 之前的文字可能的補全。
insert-completions (M-*)
插入 possible-completions 已產生的 point 之前的文字所有的補全。
menu-complete
complete 相似,但是使用可能的補全列表中的某個匹配替換要補全的詞。 重複執行 menu-complete 將遍歷可能的補全列表,插入每個匹配。 到達補全列表的結尾時,鳴終端響鈴 (按照 bell-style 的設定來做) 並恢復初始的文字。 引數 n 將在匹配列表中向前移動 n 步;負數引數可以用於在列表中向後移動。 這個命令應當與 TAB 鍵關聯,但是預設情況下是沒有關聯的。
delete-char-or-list
刪除游標下的字元,如果不是在行首或行尾 (類似 delete-char)。 如果在行尾,行為與 possible-completions 一致。 這個命令預設沒有關聯。
complete-filename (M-/)
嘗試對 point 之前的文字進行檔名補全。
possible-filename-completions (C-x /)
列出 point 之前的文字可能的補全,將它視為檔名。
complete-username (M-~)
嘗試對 point 之前的文字進行補全,將它視為使用者名稱。
possible-username-completions (C-x ~)
列出 point 之前的文字可能的補全,將它視為使用者名稱。
complete-variable (M-$)
嘗試對 point 之前的文字進行補全,將它視為 shell 變數。
possible-variable-completions (C-x $)
列出 point 之前的文字可能的補全,將它視為 shell 變數。
complete-hostname (M-@)
嘗試對 point 之前的文字進行補全,將它視為主機名。
possible-hostname-completions (C-x @)
列出 point 之前的文字可能的補全,將它視為主機名。
complete-command (M-!)
嘗試對 point 之前的文字進行補全,將它視為命令名。命令補全嘗試著將此文字 依次與別名,保留字,shell 函式,shell 內建命令,最後是可執行檔名進行匹配。
possible-command-completions (C-x !)
列出 point 之前的文字可能的補全,將它視為命令名。
dynamic-complete-history (M-TAB)
嘗試對 point 之前的文字進行補全,將此文字與歷史列表中的行相比較來查詢可能的補全匹配。
complete-into-braces (M-{)
進行檔名補全,將可能的補全列表放在花括號中插入,使得列表可以被 shell 使用 (參見上面的 Brace Expansion 花括號擴充套件)。

Keyboard Macros 宏

start-kbd-macro (C-x ()
開始儲存輸入字元為當前鍵盤宏。
end-kbd-macro (C-x ))
停止儲存輸入字元為當前鍵盤宏,儲存宏定義。
call-last-kbd-macro (C-x e)
重新執行上次定義的鍵盤宏,即顯示出宏中的字元,好像它們是從鍵盤輸入的一樣。

Miscellaneous

re-read-init-file (C-x C-r)
讀入 inputrc 檔案的內容,合併其中的按鍵關聯和變數賦值。
abort (C-g)
取消當前編輯命令,鳴終端響鈴 (按照 bell-style 的設定來做)。
do-uppercase-version (M-a, M-b, M-x, ...)
如果有 Meta 字首的字元 x 是小寫的,那麼與命令相關連的是對應的大寫字元。
prefix-meta (ESC)
將輸入的下一個字元加上 Meta 字首。 ESC f 等價於 Meta-f.
undo (C-_, C-x C-u)
增量的撤銷,分別記住每一行。
revert-line (M-r)
撤銷這一行的所有修改。這與執行命令 undo 足夠多次的效果相同,將這一行恢復到初始狀態。
tilde-expand (M-&)
對當前詞進行波浪線擴充套件。
set-mark (C-@, M-<space>)
在 point 處設定 mark。如果給出了數值的引數,標記被設定到那個位置。
exchange-point-and-mark (C-x C-x)
交換 point 和 mark。當前游標位置被設定為儲存的位置,舊游標位置被儲存為 mark。
character-search (C-])
讀入一個字元,point 移動到這個字元下一次出現的地方。負數將搜尋上一個出現。
character-search-backward (M-C-])
讀入一個字元,point 移動到這個字元上一次出現的地方。負數將搜尋下面的出現。
insert-comment (M-#)
沒有數值的引數時,readline 變數 comment-begin 的值將被插入到當前行首。如果給出一個數值的引數,命令的行為類似於一個開關: 如果行首字元不匹配 comment-begin 的值,將插入這個值,否則 匹配 comment-begin 的字元將被從行首刪除。在兩種情況下,這一行都被接受, 好像輸入了新行符一樣。 comment-begin 的預設值使得這個命令將當前行變成 一條 shell 註釋。如果數值引數使得註釋字元被刪除,這一行將被 shell 執行。
glob-complete-word (M-g)
point 之前的詞被當作路徑擴充套件的一個模式,尾部暗含了一個星號。這個模式被用來 為可能的補全產生匹配的檔名列表。
glob-expand-word (C-x *)
point 之前的詞被當作路徑擴充套件的一個模式,匹配的檔名的列表被插入,替換這個詞。 如果給出一個數值引數,在路徑擴充套件之前將新增一個星號。
glob-list-expansions (C-x g)
顯示 glob-expand-word 可能產生的擴充套件的列表,重繪當前行。如果給出一個數值引數,在路徑擴充套件之前將新增一個星號。
dump-functions
向 readline 輸出流列印所有的函式和它們的按鍵關聯。如果給出一個數值引數, 輸出將被格式化,可以用作 inputrc 檔案一部分。
dump-variables
向 readline 輸出流列印所有可設定的 readline 函式。如果給出一個數值引數, 輸出將被格式化,可以用作 inputrc 檔案一部分。
dump-macros
向 readline 輸出流列印所有關聯到宏的 readline 按鍵序列以及它們輸出的字串。 如果給出一個數值引數,輸出將被格式化,可以用作 inputrc 檔案一部分。
display-shell-version (C-x C-v)
顯示當前 bash 例項的版本資訊。

Programmable Completion 可程式設計補全

當試圖對一個命令的引數進行詞的補全時,如果已經使用內建命令 complete 定義了這個命令的補全規則 ( compspec),將啟動可程式設計補全功能 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。
首先,命令名被確認。如果針對這個命令有補全規則的定義,那麼將使用 規則來產生可能的詞的補全的列表。如果命令詞是一個路徑全名,將首先搜尋 針對這個路徑全名的規則。如果針對這個路徑全名沒有找到規則,將嘗試查詢 針對最後一個斜槓後面的部分的規則。
一旦找到了一個規則,它將用作產生匹配的詞。如果沒有找到,將進行上面 Completing 中描述的 bash 預設的補全。
首先,將執行規則指定的動作。只有以被補全的詞開始的匹配詞才會被返回。 當在檔案或目錄名補全中使用 -f-d 選項時,shell 變數 FIGNORE 將用於對匹配進行過濾。
接下來,將產生所有由 -G 選項給出的檔名擴充套件模式指定的補全。 模式產生的詞不必匹配要補全的詞。shell 變數 GLOBIGNORE 不會用於過濾匹配結果,但是變數 FIGNORE 會被使用。
接下來,將考慮 -W 選項的引數指定的字串。這個字串首先被 劃分,用特殊變數 IFS 中的字元作為分隔符。shell 引用被當作一個詞。 接下來,每個詞被擴充套件,使用上面 EXPANSION 中描述的 brace expansion, tilde expansion, parameter 和 variable expansion, command substitution, arithmetic expansion, 以及 pathname expansion 規則處理。對於結果,再使用上面 Word Splitting 中描述的規則劃分成詞。 擴充套件的結果與要補全的詞進行前部一致的比較,匹配的詞成為可能的補全。
在這些匹配被產生後,任何由 -F-C 選項指定的 shell 函式和命令將被執行。當命令或函式被執行時,變數 COMP_LINECOMP_POINT 被賦值,使用上面 Shell Variables 中的規則。 如果要執行 shell 函式,還將設定變數 COMP_WORDSCOMP_CWORD 當函式或命令被執行時,第一個引數是等待引數被補全的命令的名稱, 第二個引數是要補全的詞,第三個引數是當前命令列中,要補全的詞前面的詞。 對要補全的詞產生的補全不會進行任何過濾;函式或命令在產生匹配時有完全的自由。
任何 -F 指定的函式將被首先執行。函式可以使用任何 shell 功能, 包含內建命令 compgen,來產生匹配。它必須將可能的補全放到陣列變數 COMPREPLY 中。
接下來,任何 -C 選項指定的命令將被執行,其執行環境與命令替換 的環境相同。它應當向標準輸出列印一個補全的列表,每行一個。 反斜槓可以用來轉義一個新行符,如果需要的話。
所有可能的補全都產生之後,將對列表進行 -X 選項指定的任何過濾。 過濾器是一個模式,和路徑名擴充套件中的一樣;模式中的 & 替換為 要補全的詞。字面上的 & 可以用反斜槓轉義;反斜槓在進行匹配時被刪除。 任何匹配這個模式的補全將從列表中刪除。前導的 ! 將使模式含義相反; 這種情況下,任何不匹配這個模式的補全將被刪除。
最後, B-P-S 指定的任何字首和字尾被新增到補全列表的每個 成員後面,結果返回給 readline 補全程式碼,作為可能的補全列表。
如果先前執行的動作沒有產生任何匹配,並且在定義 compspec 規則時,為 complete 命令提供了 -o dirname 選項,將嘗試目錄名補全。
預設情況下,如果找到了一個規則,它產生的任何東西都被返回給補全程式碼, 作為可能的補全的全集。不再嘗試預設的 bash 補全,readline 預設的 檔名補全也會禁止。如果定義規則時,為 complete 命令提供了 -o default 選項,在規則沒有產生匹配時將進行 readline 預設的補全處理。
當一個規則指出期望目錄名補全時,可程式設計補全函式強制 readline 在補全的名稱 後面新增一個斜槓,如果它是一個到目錄的符號連線。然後還要經過 readline 變數 mark-directories 的值處理,不管 readline 變數 mark-symlinked-directories 的值是什麼。

歷史(HISTORY)

當啟用內建命令 set-o history 選項時,shell 允許訪問 command history,以前輸入的命令的列表。 HISTSIZE 的值用作命令列表中儲存的命令數量。 過去 HISTSIZE 個 (預設為500) 命令將被儲存。shell 將每條命令在進行引數和變數擴充套件之前 儲存到歷史列表中 (參見上面的 EXPANSION 段落),但是是在歷史擴充套件進行之後,並且要經過 shell 變數 HISTIGNOREHISTCONTROL 處理。
在啟動時,歷史根據以變數 HISTFILE 的值為名的檔案 (預設是 ~/.bash_history) 進行初始化。 如果需要的話,以 HISTFILE 為名的檔案將被截斷,來包含不超過變數 HISTFILESIZE 的值指定的行數。當互動 shell 退出時,最後 $HISTSIZE 行被從歷史列表中複製到 $HISTFILE 檔案中。如果啟用了 shell 選項 histappend (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節中對內建命令 shopt 的描述),這些行被追加到歷史檔案中,否則歷史檔案被覆蓋。如果 HISTFILE 被取消定義,或者如果歷史檔案不可寫,歷史將不會儲存。儲存歷史之後, 歷史檔案被截斷,以包含不超過 HISTFILESIZE 行。如果 HISTFILESIZE 被取消定義,不會進行截斷操作。
內建命令 fc (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節) 可以用來列出或修改並重新執行歷史列表中的一部分。內建命令 history 可以用來顯示或修改歷史列表,操作歷史檔案。當使用命令列編輯時,每種 編輯模式都有搜尋命令,提供對歷史列表的訪問。
shell 允許控制哪些命令被儲存到歷史列表中。可以設定 HISTCONTROLHISTIGNORE 變數,來使得 shell 只儲存輸入命令的一個子集。shell 選項 cmdhist 如果被啟用,將使得 shell 將多行的命令的每一行儲存到同一個歷史條目中, 在需要的地方新增分號來保證語義的正確性。shell 選項 lithist 使得 shell 儲存命令時,保留嵌入的新行而不是用分號代替。參見下面 shell 內建命令(SHELL BUILTIN COMMANDS) 中,內建命令 shopt 的描述,有關設定和取消 shell 選項的資訊。

歷史擴充套件("HISTORY EXPANSION")

shell 支援歷史擴充套件機制,類似於 csh 中歷史擴充套件。這一節描述了可用的語法特徵。在互動的 shell 中這一機制被預設啟用, 可以使用內建命令 set-H 選項來禁用它 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節)。非互動的 shell 預設不進行歷史擴充套件。
歷史擴充套件將歷史列表中的詞引入輸入流中,使得可以方便地重複已執行命令, 在當前輸入行中為前一個命令插入新的引數, 或者快速修正前一個命令中的錯誤。
歷史擴充套件在讀入一整行後,在 shell 將它拆分成詞之前立即進行。它 由兩部分組成。首先是判斷替換中使用歷史列表中哪一行。其次是選擇那一行中要包含到當前行中的部分。 從歷史中選擇的行稱為 event,從那一行中選擇的部分是 words。 可以用多種多樣的 modifiers 來操縱所選的詞。在讀入輸入時,行被按照同樣方式分解成詞, 因此多個以 metacharacter 分隔的詞,如果被引號包含,就被當成一個詞。 歷史擴充套件由歷史擴充套件字元引入,預設是 !。只有反斜槓 (\) 和單引號可以引用歷史擴充套件字元。
內建命令 shopt 可以設定多個選項值,來調整歷史擴充套件的行為。如果 shell 選項 histverify 被啟用 (參見內建命令 shopt 的描述),並且正在使用 readline, 歷史替換不會被立即傳給 shell 直譯器。與此相對,擴充套件後的行被重新載入 readline 編輯緩衝區,進行進一步的修改。如果正在使用 readline, 並且啟用了 shell 選項 histreedit, 失敗的歷史替換將被重新載入到 readline 編輯緩衝區,進行改正。內建命令 history-p 選項可以用來在執行之前檢視歷史擴充套件將如何進行。內建命令 history-s 選項可以用來在歷史列表末尾新增命令,而不真正執行它們,從而 在接下來的呼叫中可以使用它們。
shell 允許控制歷史擴充套件機制使用的多種字元 (參見上面的 Shell Variableshistchars 的描述)。

Event Designators

事件指示器 (event designator) 是一個對歷史列表中某個命令列條目的引用。
!
開始一個命令替換,除非後面跟隨的是 blank, newline, = 或是 (.
!n
引用命令列 n.
!-n
引用當前命令列減去 n.
!!
引用上一條命令。這是 `!-1' 的同義詞。
!string
引用最近的以 string 開始的命令。
!?string[?]
引用最近的包含 string 的命令。尾部的 ? 可以被忽略,如果 string 之後緊接著一個新行符。
^string1^string2^
快速替換。重複上一條命令,將 string1 替換為 string2. 與 ``!!:s/ string1/string2/'' 等價 (參見下面的 修飾符 (Modifiers))。
!#
到此為止輸入的整個命令列。

Word Designators

詞指示器 (word designator) 用於從 event 中選擇期望的詞。 : 分隔 event 規則與 word 指示器。它可以忽略,如果詞指示器以 ^, $, *, -, 或 % 開始。詞被從行首開始編號,第一個詞被表示為 0。插入當前行中的詞以單個空格分隔。
0 (zero)
第 0 個詞。對 shell 來將,這是命令名。
n
n 個詞。
^
第一個引數。也就是,第 1 個詞。
$
最後的引數。
%
最近一次搜尋 `?string?' 匹配的詞。
x-y
一組詞;`-y' 是 `0-y' 的簡寫。
*
所有詞,除了第 0 個。這是 ` 1-$' 的同義詞。如果 event 中只有一個詞,使用 * 也不是錯誤;這種情況下將返回空字串。
x*
x-$ 的簡寫。
x-
-$ 的簡寫,就像 x* 一樣,但是忽略最後一個詞。
如果給出了一個 word 指示器,沒有給出 event 規則,前一個命令將用作 event。

修飾符 (Modifiers)

可選的 word 指示器之後,可以出現一個或多個下述 modifiers 的序列,每一個都字首有 `:'。
h
刪除檔名組成的尾部,只保留頭部。
t
刪除檔名組成中前面的成分,保留尾部。
r
刪除 .xxx 形式中尾部的字尾成分,保留基本名稱部分。
e
刪除所有內容,保留尾部的字尾。
p
列印新的命令,但是不執行它。
q
引用替換所得的詞,使它不再進行替換。
x
引用替換所得的詞,類似與 q, 但是會根據 blanks,空白 和新行符分解為詞。
s/old/new/
將事件行中出現的第一個 old 替換為 new。 任何分隔符都可以用來代替 /,最後一個分隔符是可選的,如果它是事件行的最後一個字元。 oldnew 中的分隔符可以用一個反斜槓來引用。如果 & 出現在 new 中,它將替換為 old。 可以用單個反斜槓來引用 &。如果 old 為空,它將設定為最後替換的 old, 或者,如果前面沒有發生過歷史替換,就是 !?string[?] 搜尋中的最後一個 string。
&
重複上一次替換。
g
使得改變被整個事件行所接受。用於與 ` :s' 或 `:&' 結合 (例如,` :gs/old/new/')。 如果與 ` :s' 結合使用,任何分隔符都可以用來代替 /, 最後一個分隔符是可選的,如果它是事件行的最後一個字元。

shell 內建命令(SHELL BUILTIN COMMANDS)

除非另外說明,這一章介紹的內建命令如果接受 - 引導的選項,那麼它也接受 -- 作為引數,來指示選項的結束
 
: [arguments]
沒有效果;這個命令除了擴充套件 arguments 並且作任何指定的重定向之外,不做任何事。 退出時返回0。
. filename [arguments]
source filename [arguments]
讀取並在當前 shell 環境中執行 filename 中的命令,返回 filename 中最後一個命令的返回狀態。如果 filename 中不包含斜槓 (slash),系統將在 PATH 中查詢包含 filename 的目錄。在 PATH 中搜索的檔案不必是可執行的。 如果 bash 不是運行於 posix mode,當 PATH 中找不到檔案時會在當前目錄搜尋。如果 shopt 內建命令的 sourcepath 選項被關閉, PATH 將不會被搜尋。如果有任何 arguments ,它們成為 filename 的位置引數 (positional parameters),否則 位置引數不發生變化。 返回狀態是指令碼中最後一個命令退出時的狀態。 沒有執行命令則返回0,沒有找到或不能讀取 filename 時返回false。
alias [-p] [name[=value] ...]
Alias 不帶引數或者帶 -p 引數執行時將在標準輸出以這樣的格式 alias name=value 給出別名列表。 如果有引數,將建立提供了 valuename 的別名。 value 中尾部的空格使得別名被擴充套件時,下一個詞做別名替換。 對於引數列表中的每一個 name,如果 value 沒有 給出,這個別名的名稱和值會被打印出來。 Alias 返回 true 除非 name 沒有定義為別名。
bg [jobspec]
使掛起的程式 jobspec 在後臺繼續執行,就好像它是用 & 啟動的一樣。如果沒有指定 jobspec,shell 意義上的 current job 當前作業 將被使用。 bg jobspec 返回0,除非當前禁止了作業控制,或者在允許作業控制,但 是沒有找到 jobspec ,或者它不是在作業控制下啟動的時候。
bind [-m keymap] [-lpsvPSV]
bind [-m keymap] [-q function] [ -u function] [-r keyseq]
bind [-m keymap] -f filename
bind [-m keymap] -x keyseq: shell-command
bind [-m keymap] keyseq:function-name
bind readline-command
顯示當前 readline 鍵和功能的,將一個按鍵序列和一個 readline 功能或宏進行關聯,或者設定一個 readline 變數。每一個在非選項的引數都是一個命令,好像它是在 .inputrc 中出現的一樣。但是每個關聯或者命令必須作為單獨的引數傳遞; 也就是這樣 '"\C-x\C-r": re-read-init-file'。 如果有引數,它們有如下的意義:
-m keymap
使用 keymap 作為隨後的關聯的keymap。可選的 keymap 名稱是 emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command,還有 vi-insertvivi-command 等價; emacsemacs-standard 等價。
-l
列出所有的 readline 功能。
-p
以程式可讀的方式顯示 readline 功能名稱和關聯
-P
列出當前 readline 功能名稱和關聯。
-v
以程式可讀的方式顯示 readline 變數名稱和值
-V
列出當前 readline 變數和值。
-s
以程式可讀的方式顯示 readline 鍵序列和對應的宏
-S
顯示 readline 宏對應的鍵序列和他們輸出的字串
-f filename
filename 中讀取鍵序列
-q function
查詢那些鍵將執行function
-u function
取消所有關聯到 function 的鍵。
-r keyseq
取消當前任何 keyseq 的關聯。
-x keyseq:shell-command
使 shell-commandkeyseq 按下時被執行。
返回值是0,除非給出了一個不能識別的選項或是產生了一個錯誤。
break [n]
從一個 for, while, until, 或者 select 迴圈退出。 如果指定了 n ,就跳出 n 層迴圈。 n 必須 ≥ 1。如果 n 比當前迴圈層數還要大,將跳出所有迴圈。 返回值是0,除非執行 break 的時候 shell 不是在執行一個迴圈。
builtin shell-builtin [arguments]
執行指定的 shell 內建命令,傳遞 arguments ,返回命令的返回值。 這在定義了一個和 shell 內建命令同名的函式時很有用, 在那個函式中使用它來執行相應的功能。 cd 命令常以這種方式重新定義。 返回狀態是 false,如果指定的 shell-builtin 並不是一個 shell 內建命令。
cd [-L|-P] [dir]
改變當前路徑到 dir。這個變數的預設值是 HOME 目錄。環境變數 CDPATH 定義了包含 dir 的搜尋路徑。在 CDPATH 中可選的路徑名以冒號(:) 分隔。 CDPATH 中的空路徑名與當前路徑相同,就是 `` .''. 如果 目錄名 以斜槓 (/,slash) 起始,那麼 CDPATH 不會被使用。 -P 選項是說使用物理路徑結構而不是跟隨符號連結,(參見 set 命令中的 -P 選項); -L 選項強制跟隨符號連結。另外,選項 -$OLDPWD 是相同的。 返回值是 true ,如果成功地改變了目錄;否則是 false。
command [-pVv] command [arg ...]
執行 command ,使用 args 作為引數,禁止通常的查詢 shell 函式的過程。只有內建命令或者 PATH 中包含的命令可以執行。如果給出 -p 引數, command 的查詢是以 PATH 的預設值進行的。這樣可以保證找到所有的標準工具。如果給出 -V 或者 -v 選項,關於 command 的說明將被打印出來。 -v 選項使得表述這個命令的詞,或者要執行 command 需要執行的檔案顯示出來; -V 選項給出更詳細的描述。如果給出 -V 或者 -v 選項,退出狀態在找到了 command 的情況下0,沒找到就是1。 如果沒有提供選項,並且產生了錯誤或者 command 沒有找到,退出狀態就是127。否則, command 內建命令的退出狀態是 command 的退出狀態。
compgen [option] [word]
根據 optionword 產生可能的補全。 option 是 內建命令 complete 接受的任何選項,除了 -p-r,將匹配結果寫到標準輸出。 當使用 -F-C 選項時,可程式設計補全功能所設定的多數 shell 變數如果存在,其值將不再有用。 產生的匹配與可程式設計補全程式碼根據補全規則加上相同的標誌直接產生的結果相同。 如果指定了 word,只有匹配 word 的補全結果將被顯示出來。 返回值為真,除非提供了非法的選項,或者沒有產生匹配。
complete [-abcdefgjksuv] [-o comp-option] [ -A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix]
 
[ -X filterpat] [-F function] [-C command] name [name ...]
complete -pr [name ...]
指定每個 name 的引數應當如何被補全。如果給出了 -p 選項, 或者沒有選項給出,現有的補全規則將被顯示出來,以一種可以重用為輸入 的格式顯示。 -r 選項將一個針對每個 name 的補全規則刪除。 或者,如果沒有給出 name,將刪除所有補全規則。 嘗試詞的補全時,應用這些補全規則的過程在上面 Programmable Completion(可程式設計補全) 中詳述。 其他選項,如果給出的話,具有下列意義。 -G, -W, 和 -X 選項的引數 (如果需要的話,還包括 -P-S 選項) 應當被引用,避免在執行內建命令 complete 之前被擴充套件。
-o comp-option
comp-option 控制著 compspec 除了簡單地產生補全之外的多種行為。 comp-option 可以是如下之一:
default
使用 readline 的預設檔名補全,如果 compspec 沒有得到匹配。
dirnames
進行目錄名補全,如果 compspec 沒有得到匹配。
filenames
告訴 readline,compspec 產生了檔名,使它可以進行任何檔名專用的處理 (例如,給目錄名加上斜槓或消除尾部空白)。主要用於 shell 函式。
nospace
告訴 readline 不要向補全的詞在行的最後新增一個空格 (這是預設行為)。
-A action
action 可以是下列之一,來產生一系列可能的補全結果:
alias
起別名。也可以用 -a 指定。
arrayvar
陣列變數名。
binding
Readline 按鍵關聯。
builtin
shell 內建命令的名稱。也可以用 -b 指定。
command
命令名。也可以用 -c 指定。
directory
目錄名。也可以用 -d 指定。
disabled
被禁用的內建命令名稱。
enabled
啟用的內建命令名稱。
export
被匯出的 shell 變數名稱。也可以用 -e 指定。
file
檔名。也可以用 -f 指定。
function
shell 函式的名稱。
group
組名。也可以用 -g 指定。
helptopic
內建命令 help 接受的幫助主題。
hostname
主機名,從環境變數 HOSTFILE 指定的檔案中得到。
job
作業名,如果作業控制被啟用的話。也可以用 -j 指定。
keyword
shell 保留字。也可以用 -k 指定。
running
正在執行的作業名,如果作業控制被啟用的話。
service
服務名。也可以用 -s 指定。
setopt
內建命令 set-o 選項的有效引數。
shopt
內建命令 shopt 接受的 shell 選項名。
signal
訊號名。
stopped
停止的作業名,如果作業控制被啟用的話。
user
使用者名稱。也可以用 -u 指定。
variable
shell 變數的名稱。也可以用 -v 指定。
-G globpat
檔名擴充套件模式 globpat 被擴充套件,產生可能的補全。
-W wordlist
wordlist 被使用 IFS 特殊變數中的字元作為定界符來拆分,每個結果的詞被擴充套件。可能的補全是結果列表 中匹配要補全的詞的那一些。
-C command
command 將在一個子 shell 環境中執行,它的結果用作可能的補全。
-F function
shell 函式 function 將在當前 shell 環境中執行。當它結束時,可能 的補全可以從陣列元素 COMPREPLY 中得到。
-X filterpat
filterpat 是一個模式,用於檔名擴充套件。所有前面的選項和引數產生 的可能的補全都要經過這一步處理,每一個匹配 filterpat 的補全都 被從列表中刪除。為 filterpat 加上前導 ! 使模式意義相反; 這種情況下,所有不匹配 filterpat 的模式被刪除。
-P prefix
在所有其他選項都處理過之後,prefix 被加到每個可能的補全前面。
-S suffix
在所有其他選項都處理過之後,suffix 被加到每個可能的補全後面。
返回值為真,除非給出了非法的選項,給出除 -p-r 之外 的某個選項時沒有給出 name 引數,試圖刪除一條 name 的補全 規則但是規則不存在,或者新增補全規則時出錯。
continue [n]
復位到外層 for, while, until, 或 select 迴圈的下一次開始。如果指定了 n, 復位到向外第 n 層迴圈的開始。 n 必須 ≥ 1。如果 n 比外部迴圈的層數要多,將復位到最外層的迴圈 (``top-level'' loop,頂層迴圈)。 返回值是 0,除非執行 continue 時,shell 不是在迴圈之中。
declare [-afFirtx] [-p] [name[=value]]
typeset [-afFirtx] [-p] [name[=value]]
宣告變數且/或設定它們的屬性。如果沒有給出 name 則顯示變數的值。 選項 -p 將顯示每個名稱 name 的屬性和值。當使用 -p 時,其他選項被忽略。選項 -F 禁止顯示函式定義;只有函式名和屬性會被顯示。 -F 選項暗含 -f. 下列選項可用來限制只輸出具有指定屬性的變數,或者為變數設定屬性:
-a
每個 name 都是陣列變數 (參見上面的 Arrays 段落)。
-f
只使用函式名。
-i
變數被當作一個整數;當變數被賦值時將進行算術運算 (參見 算術求值 (ARITHMETIC EVALUATION) 章節)。
-r
使得 name 只讀。這些名稱不能再被後續的賦值語句賦值或取消定義。
-t
設定每個 nametrace(跟蹤) 屬性。被跟蹤的函式繼承了 呼叫者 shell 的 DEBUG 陷阱。trace 屬性對變數沒有特殊意義。
-x
標記 name 為可以透過環境匯出給後續命令。
使用 `+' 代替 `-' 將關閉屬性,特殊情況是 +a 不能用於銷燬一個 陣列變數。當用於函式中時,它使得每個 name 成為區域性的,就像 使用了 local 命令。返回值是 0,除非遇到了非法的選項,試圖使用 ``-f foo=bar'' 定義函式,試圖向只讀變數賦值,試圖向陣列變數賦值但沒有使用複合的賦值 語法 (參見上面的 Arrays 段落), name 之一不是有效的 shell 變數名,試圖將陣列變數的陣列 狀態關閉,或者是試圖使用 -f 顯示一個不存在的函式。
dirs [-clpv] [+n] [-n]
沒有選項時顯示當前儲存的目錄。預設輸出為一行,目錄名用空格分開。 可以使用 pushd 命令將目錄新增到列表, popd 命令將列表中的條目刪除。
+n
顯示 dirs 在不帶選項執行時顯示的列表的第 n 個條目,從 0 開始自左算起。
-n
顯示 dirs 在不帶選項執行時顯示的列表的第 n 個條目,從 0 開始自右算起。
-c
刪除所有條目,清空目錄棧。
-l
產生長列表;預設列表格式使用波浪線來表示個人目錄。
-p
輸出目錄棧,一行一個。
-v
輸出目錄棧,一行一個,每個條目前面加上它在棧中的位置索引。
返回值是 0,除非給出了非法的引數,或者 n 索引超出了目錄棧的範圍。
disown [-ar] [-h] [jobspec ...]
沒有選項時,每個 jobspec 被從正在執行的作業表中刪除。如果給出了 - 選項,每個 jobspec 並不從表中刪除,而是被標記,使得在 shell 接到 SIGHUP 訊號時,不會向作業發出 SIGHUP 訊號。如果沒有給出 jobspec, 也沒有給出 -a 或者 -r 選項,將使用當前作業 ( current job)。如果沒有給出 jobspec, 選項 -a 意味著刪除或標記所有作業;選項 -r 不帶 jobspec 引數時限制操作只對正在執行的作業進行。返回值是 0,除非 jobspec 不指定有效的作業。
echo [-neE] [arg ...]
輸出 arg,以空格分開,最後加一個新行符。返回值總是 0。 如果指定了 -n,將不在尾部新增新行符。如果給出了 -e 選項, 將允許解釋下列反斜槓轉義的字元。 -E 選項禁止這些跳脫字元的解釋,即使在預設解釋它們的系統中也是如此。 shell 選項 xpg_echo 可以用來在執行時判斷 echo 是否預設 展開這些跳脫字元。 echo 不將 -- 作為選項的結束。 echo 解釋下列轉義序列:
\a
alert (bell) 響鈴
\b
backspace 回退
\c
suppress trailing newline 刪除尾部新行符
\e
an escape character 字元 Esc
\f
form feed 進紙
\n
new line 新行符
\r
carriage return 回車
\t
horizontal tab 水平跳格
\v
vertical tab 豎直跳格
\\
backslash 反斜槓
\0nnn
一個八位元字元,它的值是八進位制值 nnn (零到三個八進位制數字)。
\nnn
一個八位元字元,它的值是八進位制值 nnn (一到三個八進位制數字)。
\xHH
一個八位元字元,它的值是十六進位制值 HH (一到兩個十六進位制數字)。
enable [-adnps] [-f filename] [name ...]
允許或禁止 shell 內建命令。禁止一個內建命令使得磁碟上的與內建命令同名 的檔案得以執行,不必使用它的全路徑,即使 shell 一般在搜尋磁碟上的命令之前 搜尋內建命令。如果使用了 -n 選項,每個 name 都被禁止;否則, name 被允許。例如,要使用 PATH 中搜索到的 test 命令而不是 shell 內建的那一個,可以執行 ``enable -n test''. 選項 -f 意味著從共享庫 filename 中載入新的內建命令 name, 如果系統支援動態載入的話。選項 -d 將刪除曾經用 -f 載入的內建命令。如果沒有給出 name 引數,或者給出了 -p 選項,將顯示 shell 內建命令的列表。如果沒有其他選項引數, 這個列表只包含所有被允許的 shell 內建命令;如果給出了 -n,將只顯示被禁止的內建命令;如果給出了 -a,顯示的列表中包含所有內建命令,還有命令是否被允許的指示; 如果給出了 -s,輸出被限制為 POSIX special 內建命令。 返回值是 0,除非 name 不是 shell 內建命令,或者從共享庫中載入新的內建命令時出錯。
eval [arg ...]
arg 被讀取並連結為單一的命令。這個命令然後被 shell 讀取並執行, 它的退出狀態被作為 eval 的值返回。如果沒有 args, 或僅僅包含空引數, eval 返回 0。
exec [-cl] [-a name] [command [ arguments]]
如果指定了 command, 它將替換 shell。不會產生新的程序。 arguments 成為 command 的引數。如果給出了 -l 選項,shell 將在傳遞給 command 的第 0 個引數前面加上一個連字元 (dash,`-')。這樣做和 login(1) 相同。選項 -c 使得命令 command 在一個空環境中執行。如果給出了 -a, shell 會將 name 作為第 0 個引數傳遞給要執行的命令。如果由於某種原因 as the zeroth argument to the executed command. If command 不能被執行,非互動的 shell 將退出,除非 shell 選項 execfail 被設定為允許,這種情況下它返回失敗。如果命令不能執行,互動的 shell 返回失敗。 如果沒有指定 command 任何重定向對當前 shell 發生作用,返回值是 0。如果發生重定向錯誤,返回狀態是 1。
exit [n]
使得 shell 以狀態值 n 退出。如果忽略了 n, 退出狀態是最後執行的命令的退出狀態。在 shell 終止前,對 EXIT 的陷阱將被執行。
export [-fn] [name[=word]] ...
export -p
給出的名稱 names 被標記為自動地匯出到後續執行的命令的環境中。如果給出了 -f 選項,名稱 names 指的是函式。如果沒有給出 names, 或者如果給出了 -p 選項,將列印在這個 shell 中被匯出的所有名字的列表。選項 -n 使得以此為名的變數的匯出屬性被刪除。 export 返回 0,除非遇到了非法的選項, name 之一不是有效的 shell 變數名, 或者給出了 -f 選項,而 name 不是一個函式。
fc [-e ename] [-nlr] [first] [ last]
fc -s [pat=rep] [cmd]
命令修復。第一種形式中,歷史列表中從 firstlast 範圍內的命令都被選取。 Firstlast 可以指定為字串 (可以定位最後一個以此字串開始的命令) 或者數字 (歷史列表中 的索引,負數被當作相對當前命令號的偏移)。如果沒有指定 last, 它在列舉時被設為當前命令 (因此 ``fc -l -10'' 將輸出最後 10 條命令),其他情況下被設為 first。 如果沒有指定 first, 它在編輯時被設為前一個命令,列舉是設為 -16。 選項 -n 使得列舉時不顯示命令號碼。選項 -r 將命令順序進行掉換。如果給出了 -l 選項,命令將列舉在標準輸出上。否則,將啟動 ename 給出的編輯器,編輯包含這些命令的檔案。如果沒有給出 ename, 將使用變數 FCEDIT 的值,如果 FCEDIT 沒有定義就使用 EDITOR 的值。如果仍然沒有定義,將使用 vi。 編輯結束後,被編輯的命令將回顯並執行。 第二種形式中, command 在每個 pat 的例項被 rep 替換後 都被重新執行。使用這種特性時可以起一個有用的別名: ``r=fc -s'', 這樣輸入 ``r cc'' 將執行最後的以 ``cc'' 開頭的命令,輸入 ``r'' 將重新執行上一個命令。 如果使用第一種形式,返回值是 0,除非遇到了非法的選項,或 firstlast 指定的歷史行數超出了範圍。如果給出了 -e 選項,返回值是最後執行的命令的返回值,或著是失敗,如果臨時檔案中的命令 執行出錯。如果使用第二種形式,返回狀態是重新執行的命令,除非 cmd 沒有指定一個有效的歷史行,這種情況下 fc 返回失敗。
fg [jobspec]
jobspec 恢復至前臺,使它成為當前作業。如果 jobspec 不存在,將使用 shell 意義上的當前作業 current job。返回值是 被放到前臺的命令的狀態,或者是失敗,如果在禁用作業控制時執行,或者 在啟用作業控制時執行,但 jobspec 沒有指定有效的作業,或 jobspec 指定了沒有使用作業控制的作業。
getopts optstring name [args]
getopts 由 shell 程式用來處理位置引數。 optstring 包含要識別的選項字元;如果某個字元跟隨著冒號,那麼這個選項需要一個引數, 需要用空白和它隔離開。冒號和問號字元不能用作選項字元。每次它執行時, getopts 將下一個選項放在 shell 變數 name 中,如果 name 不存在就初始化它;下一個要處理的引數的索引放在變數 OPTIND 中。每次 shell 或 shell 指令碼被執行的時候 OPTIND 被初始化為 1。當某個選項需要引數時, getopts 將那個引數放到變數 OPTARG 中。shell 不會自動重置 OPTIND; 在相同的 shell 中,如果要使用新的引數集合而需要多次呼叫 getopts 時,必須手動重置它。 當遇到選項結束的時候, getopts 以大於 0 的值退出。 OPTIND 被設定為第一個非選項的引數的索引, name 被設定為 ?。 getopts 通常解釋位置引數,但是如果 args 中給出了更多引數, getopts 將解釋它們。 getopts 能以兩種方式報告錯誤。如果 optstring 的第一個字元是冒號,將使用 silent 安靜的錯誤報告。通常的操作中,遇到非法選項或缺少選項的引數時將打印出 診斷資訊。如果變數 OPTERR 被設定為 0,不會顯示錯誤訊息,即使 optstring 的第一個字元不是冒號。 如果發現了一個非法的選項, getoptsname 中置入 ?,並且如果不是安靜模式的話,列印錯誤訊息並取消 OPTARG 的定義。如果 getopts 是安靜模式,找到的選項字元將置入 OPTARG, 不會列印診斷訊息。 如果沒有找到需要的引數,並且 getopts 不是安靜模式,將向 name 置入一個問號 ( ?),取消 OPTARG 的定義,打印出診斷訊息。如果 getopts 是安靜模式,那麼將向 name 置入一個冒號 ( :) 並且 OPTARG 將設定為找到的選項字元。 getopts 返回真,如果找到了指定的/未被指定的選項。它返回假,如果遇到了選項結束 或者發生了錯誤。
hash [-lr] [-p filename] [-dt] [ name]
對於每個 name, 透過搜尋 $PATH 中的目錄,找到命令的全路徑名並記錄它。如果給出了 -p 選項,不會進行路徑搜尋,直接將 filename 作為命令的全路徑名。選項 -r 使得 shell 忘記所有已記錄的位置。選項 -d 使得 shell 忘記已記錄的 name 的位置。如果給出了 -t 選項,每個 name 對應的全路徑名被打印出來。如果給出多個 name 作為 -t 的引數,name 將在已記錄的全路徑名 之前被打印出來。選項 -l 使得輸出以一種可以重用為輸入的格式顯示。如果沒有給出引數, 或者只給出了 -l 選項,已記錄的命令的資訊將被打印出來。 返回真,除非 name 沒有找到或給出了非法的選項。
help [-s] [pattern]
顯示關於內建命令的有用的資訊。如果指定了 pattern (模式), help 給出關於所有匹配 pattern 的命令的詳細幫助;否則所有內建命令的幫助和 shell 控制結構將被打印出來。 選項 -s 限制資訊顯示為簡短的用法概要。 返回 0,除非沒有匹配 pattern 的命令。
history [n]
history -c
history -d offset
history -anrw [filename]
history -p arg [arg ...]
history -s arg [arg ...]
不帶選項的話,顯示帶行號的命令歷史列表。列出的行中含有 * 的已經被修改過。引數 n 使得只顯示最後 n 行。如果給出了 filename,它被用做歷史檔名;沒有的話,將使用 HISTFILE 的值作為歷史檔名。選項如果給出,則具有下列意義:
-c
清空歷史列表,刪除所有條目。
-d offset
刪除 offset 位置的歷史條目。
-a
將 ``新'' 的歷史條目 (自當前 bash 會話開始輸入的歷史命令) 追加到歷史檔案中。
-n
將尚未從歷史檔案中讀取的歷史條目讀入當前歷史列表。這些行是當前 bash 會話開始之後,才追加到歷史檔案中的行。
-r
讀取歷史檔案的內容,使用它們作為當前歷史。
-w
將當前歷史列表寫入歷史檔案,覆蓋歷史檔案的原有內容。
-p
對後續的 args 進行歷史替換,在標準輸出上顯示結果。 不會將結果存入歷史列表。每個 args 都必須被引用,來禁止 普通的命令擴充套件。
-s
args 儲存到歷史列表中,作為單獨的條目。歷史列表中的最後一個命令在新增 args 之前被刪除。
返回 0,除非遇到了非法的選項,讀/寫歷史檔案發生錯誤,在 -d 的 引數中給出了無效的 offset,或者對 -p 的後續引數進行歷史擴充套件失敗。
jobs [-lnprs] [ jobspec ... ]
jobs -x command [ args ... ]
第一種形式列出正在執行的作業。選項具有下列意義:
-l
普通訊息之外,列出程序ID。
-p
只列出作業的程序組 leader 的程序ID。
-n
只顯示從上次使用者得知它們的狀態之後,狀態發生改變的作業的資訊。
-r
限制只輸出正在執行的作業。
-s
限制只輸出停止的作業。
如果給出了 jobspec 輸出被限制為僅此作業的資訊。 返回 0,除非遇到了非法的選項或給出了非法的 jobspec。
如果給出了 -x 選項,作業 jobscommandargs 中的任何 jobspec 替換為相應的程序組ID,執行 command, 傳遞引數 args 給它並返回它的退出狀態。
kill [-s sigspec | -n signum | -sigspec] [pid | jobspec] ...
kill -l [sigspec | exit_status]
向以 pidjobspec 為名的程序傳送名為 sigspecsignum 的訊號。 sigspec 可以是一個訊號名稱,類似 SIGKILL 或訊號編號; signum 是一個訊號編號。如果 sigspec 是一個訊號名稱,那麼可以有,也可以沒有 SIG 字首。如果沒有給出 sigspec, 那麼假設是 SIGTERM。 引數 -l 將列出所有訊號的名稱。如果給出 -l 時還有任何引數,將列出引數對應的訊號名稱,返回狀態 0。 -lexit_status 引數是一個數字,指定了一個訊號編號或被訊號 終止的程序的退出狀態值。 kill 返回真,如果至少成功傳送了一個訊號,或者返回假,如果發生了錯誤或遇到了 非法的選項。
let arg [arg ...]
每個 arg 都是要求值的算術表示式 (參見 算術求值 (ARITHMETIC EVALUATION) 章節)。如果最後一個引數 arg 求值結果是 0, let 返回 1;否則返回 0。
local [option] [name[=value] ...]
對每個引數將建立一個名為 name 的區域性變數並賦予值 value。 option 可以是任何 declare 接受的值。當 local 用於函式內部時,它使得變數 name 作用域侷限於函式和它的子程序。沒有運算元時, local 將區域性變數的列表寫到標準輸出。不在函式內部使用 local 會導致出錯。返回 0,除非在函式之外使用了 local, 給出了非法的 name, 或者 name 是一個只讀的變數。
logout
退出登入 shell。
popd [-n] [+n] [-n]
從目錄棧中刪除條目。沒有引數的話,從棧中刪除頂層目錄,執行 cd 切換到新的頂層目錄。如果給出了引數,有下列的含義:
+n
刪除 dirs 給出的列表中從左數第 n 個條目 (從 0 算起)。例如: ``popd +0'' 刪除第一個目錄, ``popd +1'' 第二個。
-n
刪除 dirs 給出的列表中從右數第 n 個條目 (從 0 算起)。例如: ``popd -0'' 刪除最後一個目錄, ``popd -1'' 刪除倒數第二個。
-n
阻止從棧中刪除目錄之後改變目錄,這時只對棧進行操作。
如果命令 popd 成功,還要執行一個 dirs, 返回 0。 popd 返回假,如果遇到了非法的選項,目錄棧為空,指定了目錄棧中不存在的條目, 或者改變目錄失敗。
printf format [arguments]
format 控制下將格式化的 arguments 寫到標準輸出。 format 是一個字串,包含三種類型的物件:普通字元,被簡單地 複製到標準輸出,跳脫字元,被轉換並複製到標準輸出,格式說明,每一個 都使得相鄰的下一個 argument 被打印出來。 在標準的 printf(1) 格式之外, %b 使得 printf 展開相應 arguments 中的反斜槓轉義序列, %q 使得 printf 將 相應的 argument 以一種可以重用為 shell 輸入的格式輸出。 format 在需要時被重用,以處理所有的 arguments。 如果 format 需要比所提供的更多的 arguments, 多出的格式說明視為已經提供了相應的 0 值或空字串。 成功的話返回值是 0,失敗則是非 0 值。
pushd [-n] [dir]
pushd [-n] [+n] [-n]
將目錄推入目錄棧,或者輪換棧中的內容,使棧的頂部成為當前工作目錄。 沒有引數時,交換頂部兩個目錄,返回 0,除非目錄棧為空。如果給出了引數, 它們有如下含義:
+n
輪換棧中內容,使得 dirs 給出的列表中從左數第 n 個目錄 (從 0 數起) 成為目錄棧的頂部。
-n
輪換棧中內容,使得 dirs 給出的列表中從右數第 n 個目錄 (從 0 數起) 成為目錄棧的頂部。
-n
阻止向棧中新增目錄之後改變目錄,這時只對棧進行操作。
dir
新增 dir 到棧頂,使得它成為新的當前工作目錄。
如果命令 pushd 成功,還要執行一個 dirs。 如果使用第一種形式, pushd 返回 0,除非 cd 切換到目錄 dir 失敗。使用第二中形式時, pushd 返回 0,除非目錄棧為空,指定了目錄棧中不存在的元素,或者 切換到指定的新的當前目錄失敗。
pwd [-LP]
列印當前工作目錄的絕對路徑名。如果給出了 -P 選項,或者設定了內建命令 set-o physical 選項,打印出的路徑名中不會包含符號連結。如果使用了 -L 選項,打印出的路徑中可能包含符號連結。 返回 0,除非在讀取當前目錄名時出錯或給出了非法的選項。
read [-ers] [-u fd] [-t timeout] [-a aname] [-p prompt] [-n nchars] [-d delim] [name ...]
從標準輸入讀入一行,或從 -u 選項的引數中給出的檔案描述符 fd 中 讀取,第一個詞被賦予第一個 name, 第二個詞被賦予第二個 name, 以此類推,多餘的詞和其間的分隔符被賦予最後一個 name. 如果從輸入流讀入的詞數比名稱數少,剩餘的名稱被賦予空值。 IFS 中的字元被用來將行拆分成詞。 反斜槓字元 ( \) 被用於刪除讀取的下一字元的特殊含義,以及續行。 如果給出了選項,將包含下列含義:
-a aname
詞被賦以陣列變數 aname 的連續的下標,從 0 開始。在賦新值之前, aname 被取消定義。其他 name 引數被忽略。
-d delim
delim 的第一個字元被用於結束輸入行,而不是新行符。
-e
如果標準輸入來自終端,將使用 readline (參見上面的 READLINE 章節) 來獲得輸入行。
-n nchars
read 讀入 nchars 個字元後返回,而不是等待一整行輸入。
-p prompt
讀取任何輸入之前,在標準錯誤顯示提示 prompt,末尾沒有新行符。 提示只有在輸入來自終端時才會顯示。
-r
反斜槓不作為跳脫字元。反斜槓被認為行的一部分。特殊地,一對反斜槓-新行符不作為續行。
-s
安靜模式。如果輸入來自終端,字元將不會回顯。
-t timeout
使得 read 超時並返回失敗,如果在 timeout 秒內沒有讀入完整的一行輸入。 如果 read 不是從終端或管道讀取輸入,那麼這個選項無效。
-u fd
從檔案描述符 fd 中讀取輸入。
如果沒有給出 names, 讀取的一行將賦予變數 REPLY。 返回值是 0,除非遇到了 EOF, readP 超時,或給出了非法的檔案描述符作為 -u 的引數。
readonly [-apf] [name ...]
給出的 name 將被標記為只讀的; names 的值不能被後來的賦值語句改變。如果給出了 -f 選項, names 對應的函式也被標記。選項 -a 限制變數只能是陣列型別。如果沒有給出 name 引數,或者如果給出了 -p 選項,將列印所有隻讀的名稱。選項 -p 使得輸出以一種可以被重新用作輸入的格式顯示。 返回值是 0,除非遇到了非法的選項, names 之一不是有效的 shell 變數名,或選項 -f 中給出的 name 不是一個函式。
return [n]
使得一個函式以指定值 n 退出。如果忽略了 n, 返回狀態是函式體中執行的最後一個命令的退出狀態。如果在函式外使用,但是是在一個以 . ( source) 命令執行的指令碼內,它使得 shell 中止執行指令碼,返回 n 或指令碼中執行的最後一個命令的退出狀態。如果在函式外使用,並且不是在以 . 執行的指令碼內,返回狀態是假。
set [--abefhkmnptuvxBCHP] [-o option] [ arg ...]
不帶選項時,shell 變數的名稱和值將以一種可以重用為輸入的格式顯示。 輸出根據當前語言環境進行排序。指定了選項的時候,它們設定或取消了 shell 的屬性。 處理完選項之後剩餘的任何引數都被作為位置引數的值被賦值,分別賦予 $1, $2, ... $n. 如果給出了選項,那麼具有以下含義:
-a
自動將被修改或建立的變數和函式標誌為匯出至後續命令的環境中。
-b
後臺作業結束時立即報告狀態,而不是在下次顯示主提示符前報告。只有在啟用作業控制時才有效。
-e
立即退出,如果 simple command (簡單命令,參見上面的 SHELL GRAMMAR 語法) 以非零值退出。shell 不會退出,如果失敗的命令是 untilwhile 迴圈的一部分, if 語句的一部分, &&⎪⎪ 序列的一部分,或者命令的返回值是由 ! 翻轉得到。針對 ERR 的陷阱,如果設定的話,將在 shell 退出前執行。
-f
禁止路徑擴充套件。
-h
在查詢並執行命令時,記住它們的位置。這是預設啟用的。
-k
所有以賦值語句形式出現的引數都被加入到命令執行的環境中,不僅是命令名前面那些。
-m
監視模式。作業控制被啟用。在支援這個選項的系統中,它在互動 shell 中是預設啟用的 (參見上面的 JOB CONTROL 作業控制)。 後臺程序在單獨的程序組中執行,結束時將打印出包含它們退出狀態的一行資訊。
-n
讀取命令,但不執行。這可以用在檢查 shell 指令碼中的語法錯誤。互動 shell 中它被忽略。
-o option-name
option-name 可以是如下之一:
allexport
-a 相同。
braceexpand
-B 相同。
emacs
使用 emacs 樣式的命令列編輯介面。這個選項在互動 shell 中預設啟用,除非 shell 以 --noediting 選項啟動。
errexit
-e 相同。
hashall
-h 相同。
histexpand
-H 相同。
history
允許記錄命令歷史,如上述 HISTORY 中的描述。這個選項在互動 shell 中預設啟用。
ignoreeof
它的效果是好像已經執行了 shell 命令 ``IGNOREEOF=10'' 一樣 (參見上面的 Shell Variables 變數)。
keyword
-k 相同。
monitor
-m 相同。
noclobber
-C 相同。
noexec
-n 相同。
noglob
-f 相同。 nolog 當前被忽略。
notify
-b 相同。
nounset
-u 相同。
onecmd
-t 相同。
physical
-P 相同。
posix
如果預設操作與 POSIX 1003.2 不同的話,改變 bash 的行為,來滿足標準 ( posix mode)。
privileged
-p 相同。
verbose
-v 相同。
vi
使用 vi 樣式的命令列編輯介面。
xtrace
-x 相同。
如果給出了不帶 option-name-o 選項,當前選項的值將被打印出來。如果給出了不帶 option-name+o 選項,將在標準輸出顯示一系列可以重建當前選項設定的 set 命令。
-p
開啟 privileged mode (特權模式)。 在這個模式中,不會處理 $ENV$BASH_ENV 檔案,shell 函式不會從環境中繼承,環境中如果有變數 SHELLOPTS, 也將被忽略。如果 shell 啟動時的有效使用者(組) ID 與真實使用者(組) ID 不同,並且沒有給出 -p 選項, 將執行這些操作,有效使用者 ID 將設定為真實使用者 ID。如果啟動是給出了 -p 選項,有效使用者 ID 不會 被重置。將這個選項關閉使得有效使用者和組 ID 被設定為真實使用者和組 ID。
-t
讀取並執行一個命令之後退出。
-u
在進行引數擴充套件時,將未定義的變數作為錯誤。如果試圖擴充套件未定義的變數,shell 將輸出一條錯誤訊息; 如果是非互動的 shell,shell 將以非零值退出。
-v
在讀取輸入的同時打印出來。
-x
擴充套件每個簡單命令之後,顯示 PS4 的值,接著顯示命令和它擴充套件後的引數。
-B
shell 執行花括號擴充套件 (參見上面的 Brace Expansion)。 這是預設允許的。
-C
如果設定的話, bash 使用重定向運算子 >, >&, 和 <> 時,不會覆蓋已存在的檔案。可以使用重定向運算子 >| 代替 > 來建立輸出檔案,從而繞過這個限制。
-H
允許 Enable ! 樣式的歷史替換。在互動 shell 中這個選項是預設啟用的。
-P
如果設定的話,shell 在執行類似 cd 的,改變當前工作目錄的命令時,不會跟隨符號連線。它將使用物理的目錄結構來代替。預設情況下, bash 在執行改變當前目錄的命令時跟隨路徑的邏輯鏈。
--
如果這個選項沒有引數,將取消位置引數的定義。否則,位置引數將設定為 arg,即使它們以 - 開始。
-
通知訊號的結束,使得所有剩餘的 arg 被賦予位置引數。 -x-v 選項被關閉。如果沒有 arg,位置引數將不會改變。
這個選項預設是關閉的,除非另外說明。使用 + 而不是 - 使得這些選項被關閉。選項都可以作為引數, 在 shell 啟動時指定。當前的選項集合可以從 $- 找到。返回值總是真,除非遇到了非法的選項。
shift [n]
n+1 ... 開始的選項被重新命名為 $1 ....$# 向下直到 $#-n+1 的選項被取消定義。 n 必須是非負整數,小於或等於 $#。如果 n 是 0,不會改變引數。如果沒有給出 n, 就假定它是 1。如果 n$# 大,位置引數不會改變。返回值大於 0,如果 n$# 大或小於 0;否則返回 0。
shopt [-pqsu] [-o] [optname ...]
對於控制可選的 shell 行為的變數,改變它們的值。沒有選項或者有 -p 選項時,將顯示所有可設定的選項列表,以及它們是否已經設定的指示。 -p 使得輸出以一種可以被重用為輸入的形式顯示。 其他選項有如下含義:
-s
允許(設定) 每個 optname
-u
禁止(取消) 每個 optname
-q
禁止通常的輸出 (安靜模式);返回狀態指示了 optname 是否被設定。 如果對 -q 給出了多個 optname 引數,如果所有 optname 都被允許,返回值就是 0; 否則返回非零值。
-o
限制 optname 的值為內建命令 set-o 選項定義的值。
如果使用 -s-u 時沒有給出 optname 引數,顯示將分別限於被設定或被取消的選項。 除非另外說明, shopt 選項預設被禁止(取消)。
返回值在列出選項時是 0,如果所有 optname 都被允許的話,否則是非零值。 當設定或取消選項時,返回值是 0,除非 optname 是非法的 shell 選項。
shopt 選項的列表是:
 
cdable_vars
如果設定的話,內建命令 cd 的引數如果不是目錄,就假定是一個變數,它的值是要切換到的目錄名。
cdspell
如果設定的話, cd 命令中目錄的細微拼寫錯誤能夠得以糾正。檢查的錯誤包括字元錯位,缺字元, 重複輸入同一字元。如果找到了正確的值,將列印正確的檔名,命令將繼續。 這個選項只能在互動 shell 中使用。
checkhash
如果設定的話,bash 在執行命令前檢測散列表中的命令是否存在。 如果一個被雜湊的命令不再存在,將進行正常的路徑搜尋。
checkwinsize
如果設定的話,bash 在每條命令執行後檢測視窗大小,如果需要的話就更新 LINESCOLUMNS 的值。
cmdhist
如果設定的話, bash 試著將一個多行命令的所有行放到同一個歷史條目中。這樣使得 多行命令可以容易地重新修改。
dotglob
如果設定的話, bash 會把以 `.' 開始的檔名包含在路徑名擴充套件的結果中。
execfail
如果設定的話,非互動的 shell 如果不能執行作為引數提供給內建命令 exec 的檔案時將不會退出。互動的 shell 在 exec 失敗時不會退出。
expand_aliases
如果設定的話,別名被擴充套件,就像上面 ALIASES 中講到的一樣。這個選項在互動 shell 中是預設啟用的。
extglob
如果設定的話,將允許上面 Pathname Expansion 中提到的擴充套件模式匹配特性。
histappend
如果設定的話,在 shell 退出時,歷史列表將追加到以 HISTFILE 的值為名的檔案之後,而不是覆蓋檔案。
histreedit
如果設定的話,並且正在使用 readline, 使用者可以重新修改失敗的歷史替換。
histverify
如果設定的話,並且正在使用 readline, 歷史替換的結果不會立即傳給 shell 直譯器。結果行被載入到 readline 編輯緩衝區,允許進行進一步的修改。
hostcomplete
如果設定的話,並且正在使用 readline, bash 將試著對正在進行補全的包含 的詞進行主機名補全 (參見上面的 READLINE 中的 Completing 段落)。這是預設允許的。
huponexit
如果設定的話,在互動的登入 shell 退出時 bash 將向所有作業發出 SIGHUP 訊號。
interactive_comments
如果設定的話,將允許在互動 shell 中遇到以 # 開頭的詞時忽略這個詞和一行中所有剩餘的字元 (參見上面的 COMMENTS 註釋)。 這個選項是預設允許的。
lithist
如果設定的話,並且允許了 cmdhist 選項,多行的命令在儲存到歷史中時將包含新行符,而不是在可能的地方使用分號。
login_shell
如果 shell 作為登入 shell 啟動,將設定這個選項 (參見上面的 啟動(INVOCATION) )。 這個值不可修改。
mailwarn
如果設定的話,並且 bash 正在檢測上次檢測以來被存取過的郵件, 將顯示 ``The mail in mailfile has been read''(mailfile 中的郵件已被讀取)。
no_empty_cmd_completion
如果設定的話,並且正在使用 readline, 試圖在空行上執行補全時, bash 不會搜尋 PATH 來查詢可能的補全。
nocaseglob
如果設定的話, bash 進行路徑擴充套件時使用大小寫不敏感方式匹配檔名(參見上面的 Pathname Expansion 路徑擴充套件)。
nullglob
如果設定的話, bash 將允許不匹配任何檔案的模式擴充套件為空字串而不是它們自身(參見上面的 Pathname Expansion 路徑擴充套件)。
progcomp
如果設定的話,將啟用可程式設計補全功能 (參見上面的 Programmable Completion)。 這個選項是預設啟用的。
promptvars
如果設定的話,提示字串要經過上面 PROMPTING 中描述的擴充套件,然後還要經過變數和引數擴充套件。這個選項是預設啟用的。
restricted_shell
shell 設定這個選項,如果它是以受限模式啟用的 (參見下面的 受限的shell(RESTRICTED SHELL) 章節)。這個值不能修改。在執行啟動檔案時,它不會被重置,使得啟動檔案可以 得知 shell 是否是受限的。
shift_verbose
如果設定的話,內建命令 shift 在偏移量超過位置引數的個數時列印一條錯誤訊息。
sourcepath
如果設定的話,內建命令 source (.) 使用 PATH 中的值來查詢包含作為引數給出的檔案。這個選項預設是啟用的。
xpg_echo
如果設定的話,內建命令 echo 預設擴充套件反斜槓轉義序列。
suspend [-f]
掛起 shell 的執行,直到收到一個 SIGCONT 訊號。選項 -f 表示如果這是一個登入 shell,那麼不要提示,直接掛起。返回值是 0,除非 shell 是登入 shell 並且沒有指定 -f, 或者沒有啟用作業控制。
test expr
[ expr ]
返回狀態值 0 或 1,根據條件表示式 expr 的求值而定。每個運算子和運算元都必須是一個單獨的引數。表示式使用上面 條件表示式 (CONDITIONAL EXPRESSIONS) 中的操作構造。 表示式可以用下列運算子結合,以優先順序的降序列出。
! expr
值為真,如果 expr 為假。
( expr )
返回 expr 的值。括號可以用來超越運算子的一般優先順序。
expr1 -a expr2
值為真,如果 expr1expr2 都為真。
expr1 -o expr2
值為真,如果 expr1expr2 為真。
test[ 使用基於引數個數的一系列規則,對條件表示式進行求值。
 
0 arguments
表示式為假。
1 argument
表示式為真,當且僅當引數非空。
2 arguments
如果第一個引數是 !,表示式為真,當且僅當第二個引數為空。 如果第一個引數是上面 條件表示式 (CONDITIONAL EXPRESSIONS) 中列出的單目條件運算子之一,表示式為真,當且僅當單目測試為真。 如果第一個引數不是合法的單目條件運算子,表示式為假。
3 arguments
如果第二個引數是上面 條件表示式 (CONDITIONAL EXPRESSIONS) 中列出的二進位制條件運算子之一,表示式的結果是使用第一和第三個引數作為運算元的二進位制測試的結果。 如果第一個引數是 !,表示式值是使用第二和第三個引數進行雙引數測試的結果取反。 如果第一個引數是 (,第三個引數是 ),結果是對第二個引數進行單引數測試的結果。 否則,表示式為假。這種情況下 -a-o 運算子被認為二進位制運算子。
4 arguments
如果第一個引數是 !,結果是由剩餘引數組成的三引數表示式結果取反。 否則,表示式被根據上面列出的優先順序規則解釋並執行。
5 或更多 arguments
表示式被根據上面列出的優先順序規則解釋並執行。
times
對 shell 以及 shell 執行的程序,列印累計的使用者和系統時間。 返回狀態是 0。
trap [-lp] [arg] [sigspec ...]
當 shell 收到訊號 sigspec 時,命令 arg 將被讀取並執行。如果沒有給出 arg 或者給出的是 -, 所有指定的訊號被設定為它們的初始值 (進入 shell 時它們的值)。如果 arg 是空字串, sigspec 指定的訊號被 shell 和它啟動的命令忽略。如果 arg 不存在,並且給出了 -p 那麼與每個 sigspec 相關聯的陷阱命令將被顯示出來。如果沒有給出任何引數,或只給出了 -p, trap 將打印出與每個訊號編號相關的命令列表。每個 sigspec 可以是 < signal.h> 定義的訊號名,或是一個訊號編號。 如果 sigspecEXIT (0),命令 arg 將在 shell 退出時執行。如果 sigspecDEBUG, 命令 arg 將在每個簡單命令 ( simple command,參見上面的 SHELL GRAMMAR) 之後執行。如果 sigspecERR, 命令 arg 將在任何命令以非零值退出時執行。如果失敗的命令是 untilwhile 迴圈的一部分, if 語句的一部分, &&⎪⎪ 序列的一部分,或者命令的返回值是透過 ! 轉化而來, ERR 陷阱將不會執行。選項 -l 使得 shell 列印訊號名和對應編號的列表。 shell 忽略的訊號不能被捕捉或重置。在子程序中,被捕捉的訊號在程序建立時被重置為初始值。 返回值為假,如果 sigspec 非法;否則 trap 返回真。
type [-aftpP] name [name ...]
沒有選項時,指示每個 name 將如何被解釋,如果用作一個命令名。如果使用了 -t 選項, type 列印一個字串,內容是如下之一: alias, keyword, function, builtin, 或 file , 如果 name 分別是一個別名,shell 保留字,函式,內建命令或磁碟檔案。如果沒有找到 name, 那麼不會列印任何東西,返回退出狀態假。如果使用了 -p 選項, type 返回如果 name 作為命令名,將被執行的磁碟檔名;或者返回空,如果 ``type -t name'' 不會返回 file. 選項 -P 選項強制對每個 name 搜尋 PATH, 即使 ``type -t name'' 不會返回 file. 如果命令在雜湊中, -p-P 將列印雜湊的值,而不是 PATH 中首先出現的那一個檔案。如果使用了 -a 選項, type 列印所有包含可執行的名稱 name 的場合。結果包括別名和函式,當且僅當沒有同時使用 -p 選項。使用 -a 時不會查詢雜湊中的命令表。選項 -f 阻止 shell 進行查詢,就像在內建命令 command 中一樣。 type 返回真,如果找到了任何引數。什麼都沒找到則返回假。
ulimit [-SHacdflmnpstuv [limit]]
在支援它的系統上,對 shell 和它啟動的程序,提供對可用資源的控制。 選項 -H-S 指定為所給資源設定的硬性和柔性限額。 硬性限額在設定後不能增加;柔性限額可以增加,直到與硬性限額相等。 如果沒有給出 -H-S 選項,將同時設定硬性和柔性限額。 limit 的值可以是一個數字,單位是指定資源的單元值,或者是特殊值 hard, soft, 或 unlimited 之一,意思分別是當前硬性限額,當前柔性限額和沒有限額。如果忽略了 limit, 將打印出當前對資源的柔性限額值,除非給出了 -H 選項。當指定多於一個 資源時,限額名稱和單位將在值之前打印出來。其他選項按照如下意義解釋:
-a
報告所有當前限額
-c
core 檔案的最大值
-d
程序資料段的最大值
-f
shell 建立的檔案的最大值
-l
記憶體中可以鎖定的最大值
-m
常駐記憶體的最大值
-n
開啟的檔案描述符最大個數 (大多數系統不允許設定這個值)
-p
管道大小,以 512 位元組的塊為單位 (這個值可能不能設定)
-s
棧的最大值
-t
cpu 時間總數的最大值,以秒計
-u
使用者可以執行的最大程序數
-v
shell 可用的虛擬記憶體總量的最大值
如果給出了 limit, 它將是指定資源的新限額 (選項 -a 只顯示它們)。如果沒有給出選項,則假設有 -f。 值的遞增間隔是 1024 位元組,除了 -t 單位是 秒, -p 單位是 512 位元組的塊個數, -n-u 是不可調節的值。返回 0,除非給出了非法的選項或引數,或者在設定新的限額時發生了錯誤。
umask [-p] [-S] [mode]
使用者建立檔案的掩碼被設定為 mode. 如果 mode 以數字開始,它被解釋為一個八進位制數;否則被解釋為類似於 chmod(1) 接受的符號形式的模式掩碼。如果忽略了 mode, 將列印當前掩碼值。選項 -S 使得掩碼以符號形式列印;預設輸出是八進位制數。如果給出了 -p 選項,並且忽略了 mode, 輸出將是一種可以重用為輸入的形式。返回值是 0,如果成功改變了模式,或者沒有給出 mode。 其他情況返回假。
unalias [-a] [name ...]
從已定義的別名列表中刪除 name。如果給出了 -a 將刪除所有別名定義。返回值是真,除非給出的 name 不是已定義的別名。
unset [-fv] [name ...]
將每個 name 對應的變數或函式刪除。如果沒有給出選項,或者給出了 -v 選項, name 僅包括 shell 變數。只讀的變數不能被取消定義。如果給出了 -f 選項, name 僅包括 shell 函式,函式的定義將被刪除。每個被取消定義的變數或函式都被從後續命令的環境中刪除。 如果 RANDOM, SECONDS, LINENO, HISTCMD, FUNCNAME, GROUPS, 或者 DIRSTACK 中的任何一個被取消定義,它們將喪失特殊的屬性,即使它們後來被重新定義。 退出狀態是真,除非 name 不存在或是隻讀的。
wait [n]
等待指定的程序,返回它的終止狀態。 n 可以是程序 ID 或一個作業號;如果給出的是作業號,將等待作業的管道中所有程序。如果沒有給出 n, 將等待所有當前處於啟用狀態的子程序,返回狀態是 0。如果 n 指定了不存在的程序或作業,返回狀態是 127。否則,返回狀態是所等待的最後一個程序或作業的退出狀態。

受限的shell(RESTRICTED SHELL)

如果 bashrbash 名稱啟動,或者啟動時使用了 -r 選項,那麼它成為受限的 shell。 受限的 shell 一般用來建立一個比標準的 shell 受到更多控制的環境。 它的行為與 bash 一致,除了下列行為是不允許的 (disallowed) 或不會執行的 (not performed)。
使用 cd 來改變路徑;
設定或取消 SHELL, PATH, ENV, 或 BASH_ENV 變數的值;
指定的命令名中包含 /
指定包含 / 的檔名作為傳遞給內建命令 . 的引數;
指定包含斜槓 (slash) 的檔名作為 -p 選項的引數,傳遞給 hash 內建命令;
啟動時從 shell 環境中匯入 (import) 函式定義;
啟動時解釋 shell 環境中 SHELLOPTS 的值;
使用 >, >|, <>, >&, &>, 和 >> 等重定向運算子重定向輸出;
使用 exec 內建命令來以另一個命令替換 shell;
使用 enable 內建命令的 -f-d 選項來增加和刪除內建命令;
使用 enable 內建命令來允許和禁止 shell 內建命令;
指定 command 內建命令的 -p 選項;
使用 set +rset +o restricted 來關閉受限模式。
這些限制在所有啟動檔案讀取之後才會生效。
當一個 shell 指令碼作為一個命令執行時 (參見上面的 命令執行(COMMAND EXECUTION) 章節), rbash 關閉為執行指令碼而孵化 (spawn) 的 shell 的所有限制。

參見("SEE ALSO")

Bash Reference Manual, Brian Fox and Chet Ramey
The Gnu Readline Library, Brian Fox and Chet Ramey
The Gnu History Library, Brian Fox and Chet Ramey
Portable Operating System Interface (POSIX) Part 2: Shell and Utilities, IEEE
sh(1), ksh(1), csh(1)
emacs(1), vi(1)
readline(3)

檔案(FILES)

/bin/bash
bash 可執行檔案
/etc/profile
系統範圍的初始化檔案,登入 shell 會執行它
~/.bash_profile
個人初始化檔案,登入 shell 會執行它
~/.bashrc
個人的每個互動式 shell 啟動時執行的檔案
~/.bash_logout
個人的登入 shell 清理檔案,當一個登入 shell 退出時會執行它
~/.inputrc
個人的 readline 初始化檔案

作者(AUTHORS)

Brian Fox, Free Software Foundation
 
[email protected]
Chet Ramey, Case Western Reserve University
 
[email protected]

報告BUGS (BUG REPORTS)

如果你發現一個 bash 中的 bug,你應當報告它。但是首先, 你應當確定它真的是一個 bug,並且它在你使用的最新版本的 bash 中存在。
一旦你認定存在那樣一個 bug,使用 bashbug 命令來提交一個錯誤報告。 如果你有固定住址,鼓勵你用郵政的方式提交一份! 建議和有關 bash “哲學” (`philosophical') 的 “錯誤報告” 可以寄給 [email protected] 或者貼到 Usenet 新聞組 gnu.bash.bug 之上。
所有錯誤報告應當包括:
bash 的版本號
硬體資訊和作業系統
用來編譯的編譯器
對 bug 行為的描述
可以啟用這個 bug 的一個短小的指令碼或者什麼 “秘訣” (recipe)
bashbug 會自動在它提供的錯誤報告模板中插入前三項。
關於這份手冊頁的評論和錯誤報告請直接提交到 [email protected].

BUGS

它太大了,並且有點慢。
bash 和傳統版本的 sh 之間有一些細微的差別,大部分是因為 POSIX 規約的要求。
別名機制在一些應用中會混淆。
Shell 內建命令和函式不可終止/重新開始。
組合的命令和使用 `a ; b ; c' 形式的命令序列在程序試圖暫停時不能很好處理。 當一個程序中止,shell 會立即執行序列中的下一條命令。 也可以將命令的序列放在圓括號中,來強制啟動子 shell,這樣就可以將它們作為一個單元中止了。
$(...) 命令替換中的註釋不會被解釋,直到執行替換的時候。 這將延遲報錯,直到命令開始執行之後的一段時間。
陣列變數還不能匯出 (export)。

[中文版維護人]

袁乙鈞 <[email protected]>

[中文版最新更新]

2004.03.05

《中國linux論壇man手冊頁翻譯計劃》:

http://cmpp.linuxforum.net

本頁面中文版由中文 man 手冊頁計劃提供。
 
中文 man 手冊頁計劃: https://github.com/man-pages-zh/manpages-zh

Recommended readings

Pages related to bash you should read also: