Arch manual pages

BASH(1) General Commands Manual BASH(1)

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