bash

官網(wǎng) 中文版本 好的網(wǎng)站

Content-type: text/html
BASH

Section: User Commands (1)
Updated: 2002 July 15
Index Return to Main Contents

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 兼容的命令解釋程序谋旦,可以執(zhí)行從標準輸入或者文件中讀取的命令趾徽。 Bash 也整合了 Korn 和 C Shell (ksh 和 csh) 中的優(yōu)秀特性。
Bash 的目標是成為遵循 IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2徘键,可移植操作系統(tǒng)規(guī)約: shell 和工具) 的實現(xiàn)昧狮。

選項(OPTIONS)

除了在 set 內建命令的文檔中講述的單字符選項 (option) 之外聪廉,bash 在啟動時還解釋下列選項。
-c string
如果有 -c 選項蒿秦,那么命令將從 string 中讀取。如果 string 后面有參數(shù) (argument)饺饭,它們將用于給位置參數(shù) (positional parameter渤早,以 $0 起始) 賦值。
-i
如果有 -i 選項瘫俊,shell 將交互地執(zhí)行 ( interactive )鹊杖。
-l
選項使得 bash 以類似登錄 shell (login shell) 的方式啟動 (參見下面的 啟動(INVOCATION) 章節(jié))。
-r
如果有 -r 選項扛芽,shell 成為受限的 ( restricted ) (參見下面的 受限的shell(RESTRICTED SHELL) 章節(jié))骂蓖。
-s
如果有 -s 選項,或者如果選項處理完以后川尖,沒有參數(shù)剩余登下,那么命令將從標準輸入讀取。 這個選項允許在啟動一個交互 shell 時可以設置位置參數(shù)叮喳。
-D
向標準輸出打印一個以 $ 為前導的被芳,以雙引號引用的字符串列表。 這是在當前語言環(huán)境不是 C 或 POSIX 時馍悟,腳本中需要翻譯的字符串畔濒。 這個選項隱含了 -n 選項;不會執(zhí)行命令锣咒。
[-+]O [shopt_option]
shopt_option 是一個 shopt 內建命令可接受的選項 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))侵状。 如果有 shopt_option赞弥,-O 將設置那個選項的取值; +O 取消它趣兄。 如果沒有給出 shopt_option绽左,shopt 將在標準輸出上打印設為允許的選項的名稱和值。 如果啟動選項是 +O艇潭,輸出將以一種可以重用為輸入的格式顯示拼窥。
--
-- 標志選項的結束,禁止其余的選項處理暴区。任何 -- 之后的參數(shù)將作為文件名和參數(shù)對待闯团。參數(shù) - 與此等價。
Bash 也解釋一些多字節(jié)的選項仙粱。在命令行中房交,這些選項必須置于需要被識別的單字符參數(shù)之前。

--dump-po-strings
等價于 -D伐割,但是輸出是 GNU gettext po (可移植對象) 文件格式
--dump-strings
等價于 -D
--help
在標準輸出顯示用法信息并成功退出
--init-file file
--rcfile file
如果 shell 是交互的候味,執(zhí)行 file 中的命令,而不是標準的個人初始化文件 ~/.bashrc (參見下面的 啟動(INVOCATION) 章節(jié))
--login
等價于 -l
--noediting
如果 shell 是交互的隔心,不使用 GNU readline 庫來讀命令行
--noprofile
不讀取系統(tǒng)范圍的啟動文件 /etc/profile 或者任何個人初始化文件 ~/.bash_profile, ~/.bash_login, 或 ~/.profile 白群。默認情況下, bash 在作為登錄 shell 啟動時讀取這些文件 (參見下面的 啟動(INVOCATION) 章節(jié))
--norc
如果 shell 是交互的硬霍,不讀取/執(zhí)行個人初始化文件 ~/.bashrc 這個選項在 shell 以 sh 命令啟動時是默認啟用的
--posix
如果默認操作與 POSIX 1003.2 標準不同的話帜慢,改變 bash 的行為來符合標準 (posix mode)
--restricted
shell 成為受限的 (參見下面的 受限的shell(RESTRICTED SHELL) 章節(jié))
--rpm-requires
產(chǎn)生一個為使腳本運行,需要的文件的列表唯卖。 這個選項包含了 -n 選項粱玲。 它是為了避免進行編譯期錯誤檢測時的限制-- Backticks, [] tests, 還有 evals 不會被解釋,一些依賴關系可能丟失
--verbose
等價于 -v
--version
在標準輸出顯示此 bash 的版本信息并成功退出拜轨。

參數(shù)(ARGUMENTS)

如果選項處理之后仍有參數(shù)剩余抽减,并且沒有指定 -c 或 -s 選項,第一個參數(shù)將假定為一個包含 shell 命令的文件的名字橄碾。 如果 bash 是以這種方式啟動的卵沉, $0 將設置為這個文件的名字,位置參數(shù)將設置為剩余的其他參數(shù)法牲。 Bash 從這個文件中讀取并執(zhí)行命令史汗,然后退出淀散。 Bash 的退出狀態(tài)是腳本中執(zhí)行的最后一個命令的退出狀態(tài)马胧。 如果沒有執(zhí)行命令,退出狀態(tài)是0械哟。 嘗試的步驟是先試圖打開在當前目錄中的這個文件恶复,接下來怜森, 如果沒有找到,shell 將搜索腳本的 PATH 環(huán)境變量中的路徑谤牡。
啟動(INVOCATION)

login shell 登錄 shell副硅,參數(shù)零的第一個字符是 - ,或者啟動時指定了 --login 選項的 shell翅萤。
interactive 交互的 shell恐疲,是一個啟動時沒有指定非選項的參數(shù),并且沒有指定 -c 選項套么,標準輸出和標準輸入都連接到了終端 (在 isatty(3) 中判定) 的shell培己,或者啟動時指定了 -i 選項的 shell。如果 bash 是交互的胚泌, PS1 環(huán)境變量將被設置省咨,并且 $- 包含 i ,允許一個 shell 腳本或者一個啟動文件來檢測這一狀態(tài)玷室。

下列段落描述了 bash 如何執(zhí)行它的啟動文件零蓉。如果這些啟動文件中的任一個存在但是不可讀取, bash 將報告一個錯誤穷缤。文件名中的波浪號 (~,tilde) 將像 EXPANSION 章節(jié)中 Tilde Expansion 段描述的那樣展開敌蜂。

當 bash 是作為交互的登錄 shell 啟動的,或者是一個非交互的 shell 但是指定了 --login 選項津肛, 它首先讀取并執(zhí)行 /etc/profile 中的命令章喉,只要那個文件存在。 讀取那個文件之后身坐,它以如下的順序查找 ~/.bash_profile, ~/.bash_login, 和 ~/.profile, 從存在并且可讀的第一個文件中讀取并執(zhí)行其中的命令秸脱。 --noprofile 選項可以用來在 shell 啟動時阻止它這樣做。

當一個登錄 shell 退出時掀亥, bash 讀取并執(zhí)行文件 ~/.bash_logout 中的命令撞反,只要它存在。

當一個交互的 shell 但不是登錄 shell 啟動時搪花, bash 從文件 ~/.bashrc 中讀取并執(zhí)行命令遏片,只要它存在〈楦停可以用 --norc 選項來阻止它這樣做吮便。 --rcfile file 選項將強制 bash 讀取并執(zhí)行文件 file 中的命令,而不是 ~/.bashrc 中的幢踏。

當 bash 以非交互的方式啟動時髓需,例如在運行一個 shell 腳本時,它在環(huán)境中查找變量 BASH_ENV 房蝉,如果它存在則將它的值展開僚匆,使用展開的值作為一個文件的名稱微渠,讀取并執(zhí)行。 Bash 運作的過程就如同執(zhí)行了下列命令:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
但是沒有使用 PATH 變量的值來搜索那個文件名咧擂。

如果 bash 以名稱 sh 啟動逞盆,它試圖模仿 (mimic) sh 歷史版本的啟動過程,盡可能地相似松申,同時也遵循 POSIX 標準云芦。 當作為交互式登錄 shell 啟動時,或者是非交互但使用了 --login 選項 啟動的時候,它首先嘗試讀取并執(zhí)行文件 /etc/profile 和 ~/.profile, 中的命令. 選項 --noprofile 用于避免這種行為.當使用命令 sh 來啟動一個交互式的 shell 時, bash 查找環(huán)境變量 ENV, 如果有定義的話就擴展它的值,然后使用擴展后的值作為要讀取和執(zhí)行的文件 的名稱.由于使用 sh 啟動的 shell 不會讀取和執(zhí)行任何其他的啟動文件,選項 --rcfile 沒有意義.使用名稱 sh 啟動的非交互的 shell 不會讀取任何其他啟動文件.當以 sh 啟動時, bash 在讀取啟動文件之后進入 posix 模式.

當 bash 以 posix 模式啟動時,(和使用 --posix 命令行參數(shù)效果相同),它遵循 POSIX 標準. 這種模式下,交互式 shell 擴展 ENV 環(huán)境變量的值,讀取并執(zhí)行以擴展后值為文件名的配置文件. 不會讀取其他文件.

Bash 試著檢測它是不是由遠程 shell 守護程序,通常為 rshd 啟動的.如果 bash 發(fā)現(xiàn)它是由 rshd 啟動的,它將讀取并執(zhí)行 ~/.bashrc 文件中的命令, 只要這個文件存在并且可讀.如果以 sh 命令啟動,它不會這樣做. 選項 --norc 可以用來阻止這種行為,選項 --rcfile 用來強制讀取另一個文件,但是通常 rshd 不會允許它們, 或者用它們來啟動 shell.

如果 shell 是以與真實用戶(組) id 不同的有效用戶(組) id 來啟動的, 并且沒有 - 選項,那么它不會讀取啟動文件, 也不會從環(huán)境中繼承 shell 函數(shù). 環(huán)境變量中如果出現(xiàn) SHELLOPTS, 它將被忽略.有效用戶 id 將設置為真實用戶 id. 如果啟動時給出了 -
選項,那么啟動時的行為是類似的, 但是不會重置有效用戶 id.

定義(DEFINITIONS)

下列定義在文檔余下部分中通用.

blank 空白
一個空格或是 tab .
word 詞
一個字符序列, shell 將它們視為一個結構單元. 也稱為一個 token片段贸桶。
name 名稱
一個只由字母,數(shù)字和下劃線構成的詞,并且以字符或下劃線起始. 也稱為一個 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 結束. 第一個詞指明了要執(zhí)行的命令, 它被作為第 0 個參數(shù). 其余詞被作為這個命令的參數(shù).

simple command 簡單命令的返回值是它的退出狀態(tài), 或是 128+n, 如果命令被 signal(信號) n 結束的話.

Pipelines 管道

pipeline(管道) 是一個或多個命令的序列舅逸,用字符 | 分隔。管道的格式是這樣:

[time [-p]] [ ! ] command [ | command2 ... ]

命令 command 的標準輸出通過管道連接到命令 command2 的標準輸入皇筛。連接是在命令指定的任何重定向之前進行的(參見下面的 REDIRECTION 重定向)琉历。

如果保留字 ! 作為管道前綴,管道的退出狀態(tài)將是最后一個命令的退出狀態(tài)的邏輯非值设联。 否則善已,管道的退出狀態(tài)就是最后一個命令的。 shell 在返回退出狀態(tài)值之前离例,等待管道中的所有命令返回换团。

如果保留字 time 作為管道前綴,管道中止后將給出執(zhí)行管道耗費的用戶和系統(tǒng)時間宫蛆。 選項 -p 將使輸出符合 POSIX 指定的格式艘包。 環(huán)境變量 TIMEFORMAT 可以設置為一個格式字符串,指定時間信息應當如何顯示耀盗;參見下面的 Shell Variables 環(huán)境變量 中 TIMEFORMAT 的講述想虎。

管道中的每個命令都作為單獨的進程來執(zhí)行(即,在一個子 shell 中啟動)叛拷。

Lists 序列

list(序列)是一個或多個管道舌厨,用操作符 ;, &, &&, 或 || 分隔的序列, 并且可以選擇用 ;, &, 或 <newline>新行符結束.

這些序列操作符中, && 和 || 優(yōu)先級相同忿薇,其次是 ; 和 &, 它們的優(yōu)先級是相同的裙椭。

序列中可以有一個或多個新行符來分隔命令,而不是使用分號分隔署浩。

如果一個命令是由控制操作符 & 結束的, shell 將在后臺的子 shell 中執(zhí)行這個命令揉燃。 shell 不會等待命令執(zhí)行結束,返回狀態(tài)總是 0筋栋。以分號 ; 分隔的命令會被順序執(zhí)行炊汤;shell 會等待每個命令依次結束。返回狀態(tài)是最后執(zhí)行的命令的返回狀態(tài)。

控制操作符 && 和 || 分別代表 AND 和 OR 序列抢腐。一個 AND 序列的形式是

command1 && command2

command2 只有在 command1 返回 0 時才被執(zhí)行姑曙。

一個 OR 序列的形式是

command1 || command2

command2 只有在 command1 返回非 0 狀態(tài)時才被執(zhí)行。AND 和 OR 序列的返回狀態(tài)是序列中最后執(zhí)行的命令的返回狀態(tài)氓栈。

Compound Commands 復合命令

compound command(復合命令) 是如下情況之一:

(list)
list 序列將在一個子 shell 中執(zhí)行渣磷。變量賦值和影響 shell 環(huán)境變量的內建命令在命令結束后不會再起作用。 返回值是序列的返回值授瘦。
{ list; }
list 序列將在當前 shell 環(huán)境中執(zhí)行。序列必須以一個新行符或分號結束竟宋。 這種做法也稱為 group command(命令組)提完。返回值是序列的返回值。注意與元字符 ( 和 ) 不同丘侠, { 和 } 是 reserved words(保留字)徒欣,必須出現(xiàn)在能夠識別保留字的場合。 由于它們不會產(chǎn)生斷詞(cause a word break)蜗字,它們和序列之間必須用空格分開打肝。
((expression))
表達式 expression 將被求值。求值規(guī)則在下面的 算術求值(ARITHMETICEVALUATION) 章節(jié)中描述挪捕。如果表達式的值非零粗梭,返回值就是 0;否則返回值是 1级零。這種做法和 let "expression" 等價断医。
[[ expression ]]
返回 0 或 1,取決于條件表達式 expression 求值的情況奏纪。 表達式是由下面 CONDITIONALEXPRESSIONS條件表達式 章節(jié)中描述的原語(primaries) 組成鉴嗤。 [[ 和 ]] 中的詞不會進行詞的拆分和路徑的擴展處理; 而tilde 擴展序调,參數(shù)和變量擴展醉锅,算術擴展,命令替換发绢,函數(shù)替換和引用的去除則都將進行硬耍。
當使用 == 和 != 操作符時,操作符右邊的字符串被認為是一個模式朴摊,根據(jù)下面 Pattern Matching(模式匹配) 章節(jié)中的規(guī)則進行匹配默垄。 如果匹配則返回值是 0,否則返回 1甚纲。模式的任何部分可以被引用口锭,強制使它作為一個字符串而被匹配。

表達式可以用下列操作符結合起來。根據(jù)優(yōu)先級的降序列出如下:

( expression )
返回表達式 expression 的值鹃操。括號可以用來提升操作符的優(yōu)先級韭寸。
! expression
返回真,如果表達式 expression 返回假荆隘。
expression1 && expression2
返回真恩伺,如果表達式 expression1 和 expression2 都返回真。
expression1 || expression2 返回真椰拒,如果表達式 expression1 或者 expression2 二者之一返回真晶渠。
&&(與) 和 || 操作符不會對表達式 expression2 求值,如果 expression1 可以決定整個條件表達式的返回值的話燃观。

for name [ in word ] ; do list ; done
in 之后的一系列詞會被擴展褒脯,產(chǎn)生一個項目列表。變量 name 被依次賦以這個列表中的每個元素缆毁, 序列 list 每次都被執(zhí)行番川。如果 in word 被忽略,那么 for 命令遍歷 已設置的位置參數(shù)(positional parameter脊框,參見下面的 PARAMETERS 參數(shù))颁督, 為每一個執(zhí)行一次序列 list。 返回值是最后一個命令的返回值浇雹。如果 in 之后的詞擴展的結果是空列表沉御,就不會執(zhí)行任何命令,返回值是 0箫爷。
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
首先嚷节,算術表達式 expr1 被根據(jù)下面 算術求值(ARITHMETICEVALUATION)“ 中的規(guī)則進行求值。 然后算術表達式 expr2 被循環(huán)求值虎锚,直到它等于 0野揪。每次 expr2 結果非零時吮成,序列 list 都被執(zhí)行, 算術表達式 expr3 被求值。如果任何表達式被忽略咽安,將被視為執(zhí)行結果是 1御吞。 返回值是序列 list 中被執(zhí)行的最后一個命令的返回值席怪;或者是 false畜普,如果任何表達式非法的話。
select name [ in word ] ; do list ; done
in 之后的一系列詞會被擴展护侮,產(chǎn)生一個項目列表敌完。這個擴展后的詞集合被輸出到標準錯誤上,每個前面 加上一個數(shù)字羊初。如果 in word 被忽略滨溉,將輸出位置參數(shù) (參見下面的 PARAMETERS 參數(shù) 章節(jié))什湘。 PS3 提示符將被顯示出來,等待從標準輸入得到一行輸入晦攒。如果 輸入是一個數(shù)字且顯示中有對應的詞闽撤,那么變量 name 的值將設置為這個詞。如果輸入一個空行脯颜,那么詞和提示符將再次顯示出來哟旗。如果讀入了一個 EOF,命令就結束栋操。 任何其他值將設置變量 name 為空闸餐。讀入的行保存為變量 REPLY. 序列 list 在每次選擇之后都會執(zhí)行,直到執(zhí)行了一個 break 命令矾芙。 select 的退出狀態(tài)是序列 list 中執(zhí)行的最后一個命令的退出狀態(tài)绎巨,如果沒有執(zhí)行命令就是 0。
case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
case 命令首先擴展 word, 然后依次試著用每個 pattern 來匹配它蠕啄, 使用與路徑擴展相同的匹配規(guī)則(參見下面的 Pathname Expansion 路徑擴展 章節(jié))。如果找到一個匹配戈锻,相應的序列將被執(zhí)行歼跟。找到一個匹配之后,不會再嘗試其后的匹配格遭。 如果沒有模式可以匹配哈街,返回值是 0。否則拒迅,返回序列中最后執(zhí)行的命令的返回值骚秦。
if list; then list; [ elif list; then list; ] ... [ else list; ] fi
序列 if list 被執(zhí)行。如果退出狀態(tài)是 0璧微,then list 將被執(zhí)行作箍。否則,每個 elif 將被一次執(zhí)行前硫,如果退出狀態(tài)是 0胞得,相應的 then list 將被執(zhí)行,命令結束屹电。 否則阶剑,else list 將被執(zhí)行,如果存在的話危号。 退出狀態(tài)是最后執(zhí)行的命令的退出狀態(tài)牧愁,或者是 0,如果所有條件都不滿足外莲。
while list; do list; done
until list; do list; done
while 命令不斷地執(zhí)行序列 do list猪半,直到序列中最后一個命令返回 0。 until 命令和 while 命令等價,除了對條件的測試恰好相反办龄;序列 do list 執(zhí)行直到序列中最后一個命令返回非零狀態(tài)值烘绽。 while 和 until 命令的退出狀態(tài)是序列 do list 中最后一個命令的退出狀態(tài), 或者是 0俐填,如果沒有執(zhí)行任何命令安接。
[ function ] name () { list; }
這樣可以定義一個名為 name 的函數(shù)。函數(shù)體 body 是包含在 { 和 } 之間的命令序列 list英融。 在指定將 name 作為一個命令運行的場合盏檐,這個序列將被執(zhí)行。 函數(shù)的退出狀態(tài)是函數(shù)體最后執(zhí)行的命令的退出狀態(tài)(參見下面的 FUNCTIONS 函數(shù) 章節(jié))驶悟。

注釋(COMMENTS)

在非交互的 shell 中或者使用內建命令 shopt 啟用了 interactive_comments 選項的交互的 shell 中胡野,以 # 起始的詞使得這個詞和所有同一行上所有剩余的字符都被忽略。沒有啟用 interactive_comments 選項的交互式 shell 不允許出現(xiàn)注釋痕鳍。這個選項在交互式 shell 中是默認啟用的 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))硫豆。
引用(QUOTING)

引用 Quoting 用來去掉特定字符或詞的特殊意義。引用可以用來禁止對特殊字符的處理笼呆, 阻止保留字被識別熊响,還用來阻止參數(shù)的擴展。
上面在 DEFINITIONS 定義 中列出的每個元字符 metacharacters 對于 shell 都有特殊意義诗赌。如果要表達它的本義汗茄,必須引用它。

在使用命令行歷史擴展功能時铭若,history expansion 字符洪碳,通常是 !,必須被引用叼屠,才不會進行歷史擴展瞳腌。

有三種引用機制:轉義字符 (escape character), 單引號和雙引號。

一個未被引用的反斜杠 () 是轉義字符 escape character环鲤。 它保留其后下一個字符的字面意義纯趋,除非那是一個新行符。 如果 \ 和新行符成對出現(xiàn)冷离,并且反斜杠自身沒有被引用吵冒,那么 <newline> 被視為續(xù)行標志 (意思是,它被從輸入流中刪除并忽略了)西剥。

將字符放在單引號之中痹栖,將保留引用中所有字符的字面意義。單引號不能包含在單引號引用之中瞭空,即使前面加上了反斜杠揪阿。

將字符放在雙引號中疗我,同樣保留所有字符的字面意義,例外的情況是 $, , 和 \南捂。 字符 $ 和 在雙引號中仍然具有特殊意義吴裤。反斜杠只有后面是下列字符時才有特殊意義: $, `, ", , 或 <newline>. 雙引號可以包含在雙引號引用中,但要在前面加上一個反斜杠溺健。

特殊的參數(shù) * 和 @ 在雙引號中有特殊意義(參見下面的 PARAMETERS 參數(shù) 章節(jié))麦牺。

形式為 $'string' 的詞會被特殊處理。它被擴展為 string鞭缭,其中的反斜杠轉義字符 被替換為 ANSI C 標準中規(guī)定的字符剖膳。反斜杠轉義序列,如果存在的話岭辣,將做如下轉換:

\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 (一到三個數(shù)字)。
\xHH
一個八比特字符沦童,它的值是十六進制值 HH (一到兩個十六進制數(shù)字)仑濒。
\cx
一個 ctrl-x 字符
擴展結果是單引號引用的,就好像 $ 符號不存在一樣偷遗。

雙引號引用字符串前面加上一個 $ 符號將使得這個字符串被根據(jù)當前語言環(huán)境 (locale) 來翻譯躏精。 如果當前語言環(huán)境是 C 或者 POSIX,這個符號將被忽略鹦肿。 如果這個字符串被翻譯并替換了,那么替換結果是雙引號引用的辅柴。

參數(shù)(PARAMETERS)

一個參數(shù) parameter 是一個儲存值的實體箩溃。它可以是一個名稱 name, 一個數(shù)字或者是下面 Special Parameters 特殊參數(shù) 章節(jié)中列出的特殊字符之一。從 shell 的角度來看碌嘀,一個變量 variable 是一個由名稱 name 代表的參數(shù)涣旨。一個變量有一個值 value 以及零個或多個屬性 attibutes。屬性可以使用內建命令 declare 來設置(參見下面 shell內建命令(SHELLBUILTINCOMMANDS) 章節(jié)中對 declare 的描述)股冗。
如果給一個參數(shù)賦值霹陡,那么它就被定義了≈棺矗空字符串是有效的值烹棉。一旦一個變量被定義了,它只能用內建命令 unset 來取消(參見下面 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié)).

一個變量 variable 可以用這樣的語句形式來賦值:

name=[value]

如果沒有給出值 value怯疤, 變量就被賦為空字符串浆洗。所有值 values 都經(jīng)過了波浪線擴展,參數(shù)和變量擴展集峦,命令替換伏社,算術擴展和引用的刪除(參見下面的 EXPANSION 擴展 章節(jié))抠刺。如果變量設置了 integer 整數(shù) 屬性,那么值 value 將進行算術擴展摘昌,即使沒有應用 $((...)) 擴展 (參見下面的 Arithmetic Expansion 算術擴展 章節(jié))速妖。 不會進行詞的拆分,除非是下面 Special Parameters 特殊參數(shù) 中提到的 "$@"聪黎。 不會進行路徑的擴展罕容。賦值語句也出現(xiàn)在下列內建命令中,作為它們的參數(shù): declare, typeset, export, readonly, 和 local 挺举。

Positional Parameters 位置參數(shù)

位置參數(shù) positional parameter 是以一或多個數(shù)字代表的參數(shù)杀赢,除了 0。位置參數(shù)是在 shell 啟動時湘纵,根據(jù)它的參數(shù)來賦值的脂崔, 也可以用內建命令 set 來重新賦值。位置參數(shù)不能用賦值語句來賦值梧喷。在一個 shell 函數(shù)被執(zhí)行的時候砌左,位置參數(shù)會被暫時地替換掉 (參見下面的 FUNCTIONS 函數(shù) 章節(jié))。

當位置參數(shù)由兩個以上的數(shù)字構成時铺敌,它必須放在括號內 (參見下面的 EXPANSION 擴展 章節(jié))汇歹。

Special Parameters 特殊參數(shù)

shell 對一些參數(shù)做特殊處理。這些參數(shù)只能被引用而不能被賦值偿凭。

擴展為位置參數(shù)产弹,從 1 開始。如果擴展發(fā)生在雙引號中弯囊,它擴展為一個詞痰哨,值是各個參數(shù),以特殊變量 IFS 的第一個字符分隔匾嘱。也就是說斤斧,"$*" 等價于 "$1c$2c...",這里 c 是變量 IFS 的第一個字符霎烙。如果沒有設置 IFS撬讽, 那么參數(shù)將用空格分隔。 IFS
@
擴展為位置參數(shù)悬垃,從 1 開始游昼。如果擴展發(fā)生在雙引號中危纫,每個參數(shù)都將擴展為一個詞斯稳。也就是說, "$@" 等價于 "$1" "$2" ... 如果位置參數(shù)不存在舷蒲,"$@" 和 $@ 擴展為空 (即趟佃,它們被刪除了)扇谣。

擴展為位置參數(shù)的個數(shù)昧捷,以十進制表示。
?
擴展為最近執(zhí)行的前臺管道的狀態(tài)罐寨。

擴展為當前選項標志靡挥。標志是在啟動時或以內建命令 set 指定的,或者是 shell 自身設置的 (例如選項 -i )鸯绿。
$
擴展為 shell 的進程 ID跋破。在一個 () 子 shell 中,它擴展為當前 shell 的 進程 ID 而不是子 shell 的瓶蝴。
!
擴展為最近一次執(zhí)行的后臺 (異步) 命令的進程號毒返。
0
擴展為 shell 或者 shell 腳本的名稱。這個變量是在 shell 初始化時設置的舷手。如果 bash 是執(zhí)行腳本文件時啟動的拧簸, $0 將設置為那個文件的名稱。如果 bash 啟動時的參數(shù)包含 -c男窟, 那么 $0 被設置為啟動命令行被執(zhí)行后的第一個參數(shù)盆赤,如果有的話。否則歉眷,它被設置為用來啟動 bash 的文件名牺六,就是參數(shù) 0。
_
shell 啟動時汗捡,設置為 shell 或參數(shù)中被執(zhí)行的 shell 腳本的絕對路徑名淑际。 然后,在擴展時擴展為上一個命令的最后一個參數(shù)扇住。它也被設置為被執(zhí)行的每個命令的文件全名并且 被設置到這個命令執(zhí)行的環(huán)境當中庸追。當檢查郵件時,這個參數(shù)保存著正在檢查的郵件文件的名稱台囱。

Shell Variables 變量

shell 定義了下列變量:

BASH
擴展為用來啟動當前 bash 實例的文件全名。
BASH_VERSINFO
一個只讀數(shù)組變量读整,成員保存著當前 bash 實例的版本信息簿训。賦予數(shù)組元素的值是如下這些:
BASH_VERSINFO[0]
主版本號 (release).
BASH_VERSINFO[1]
次版本號 (version).
BASH_VERSINFO[2]
補丁版本
BASH_VERSINFO[3]
編譯信息
BASH_VERSINFO[4]
發(fā)布時的狀態(tài) (例如, beta1).
BASH_VERSINFO[5]
MACHTYPE 平臺類型
BASH_VERSION
擴展為一個字符串,描述了這個 bash. 實例的版本米间。
COMP_CWORD
${COMP_WORDS} 的索引强品,指向當前光標位置所在的詞。 這個變量只有在被可編程補全功能 (參見下面的 Programmable Completion 章節(jié)) 調用的 shell 函數(shù)中才可用屈糊。
COMP_LINE
當前命令行的榛。這個變量只有在被命令補全功能調用的 shell 函數(shù)和外部命令中才可用。
COMP_POINT
相對于當前命令起始處的當前光標位置逻锐。如果當前光標位置是當前命令的末端夫晌, 它的值就和 ${#COMP_LINE} 相等雕薪。 這個變量只有在被命令補全功能調用的 shell 函數(shù)和外部命令中才可用。
COMP_WORDS
一個數(shù)組變量 (參見下面的 Arrays(數(shù)組)一節(jié))晓淀,由當前命令行的各個單詞構成所袁。 這個變量只有在被命令補全功能調用的 shell 函數(shù)中才可用。
DIRSTACK
一個數(shù)組變量凶掰,包含當前目錄棧的內容燥爷。棧中的目錄排列的順序就是用內建命令 dirs 顯示時的順序。對這個數(shù)組變量的成員賦值可以用來修改棧中已有的目錄懦窘,但是要添加和刪除目錄就必須使用 內建命令 pushd 和 popd前翎。 對它賦值不會改變當前目錄。如果取消了 DIRSTACK 的定義畅涂,它就失去了它的特殊意義港华,即使后來重新定義它。
EUID
擴展為當前用戶的有效用戶 ID毅戈。它在 shell 啟動時設置苹丸。它是只讀的。
FUNCNAME
當前執(zhí)行的 shell 函數(shù)名苇经。這個變量只有在執(zhí)行一個 shell 函數(shù)時存在赘理。向 FUNCNAME 賦值沒有效果并且返回一個錯誤。如果取消了 FUNCNAME 的定義扇单,它就失去了特殊的意義商模,即使后來重新定義它。
GROUPS
一個數(shù)組變量蜘澜,包含當前用戶所屬的組的列表施流。向 GROUPS 賦值沒有效果并且返回一個錯誤。如果取消了 GROUPS 的定義鄙信,它就失去了特殊的意義瞪醋,即使后來重新定義它。
HISTCMD
當前命令的歷史編號装诡,或者歷史列表中的索引银受。如果取消了 HISTCMD 的定義,它就失去了特殊的意義鸦采,即使后來重新定義它宾巍。
HOSTNAME
自動設置為當前的主機名。
HOSTTYPE
自動設置為一個字符串渔伯,唯一地標識著正在運行 bash 的機器類型顶霞。默認值是系統(tǒng)相關的。
LINENO
每次引用這個參數(shù)時锣吼,shell 將它替換為一個指示在腳本或函數(shù)中當前行號的十進制數(shù)字(從 1 開始)选浑。 如果不是在腳本或函數(shù)中蓝厌,替換得到的值不一定有意義。如果取消了 LINENO 的定義鲜侥,它就失去了特殊的意義褂始,即使后來重新定義它。
MACHTYPE
自動設置為一個字符串描函,完整的描述了正在運行 bash 的系統(tǒng)類型崎苗,格式是標準的 GNU cpu-company-system 格式。默認值是系統(tǒng)相關的舀寓。
OLDPWD
上一次命令 cd 設置的工作目錄胆数。
OPTARG
內建命令 getopts 處理的最后一個選項參數(shù)值 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))。
OPTIND
內建命令 getopts 將處理的下一個參數(shù)的索引 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))互墓。
OSTYPE
自動設置的一個字符串必尼,描述了正在運行 bash 的操作系統(tǒng)。默認值是系統(tǒng)相關的篡撵。
PIPESTATUS
一個數(shù)組變量 (參見下面的 Arrays 數(shù)組 章節(jié))判莉,包含最近執(zhí)行的前臺管道中的進程(可能只包含一個命令)的退出狀態(tài)。
PPID
shell 的父進程的進程號育谬。這個變量是只讀的券盅。
PWD
由 cd 命令設置的當前工作目錄。
RANDOM
每次引用這個參數(shù)時膛檀,都會產(chǎn)生一個 0 到 32767 之間的隨機整數(shù)锰镀。可以通過向 RANDOM 賦值來初始化隨機數(shù)序列咖刃。如果取消了 RANDOM 的定義泳炉,它就失去了特殊的意義,即使后來重新定義它嚎杨。
REPLY
變量的值將作為內建命令 read 的輸入花鹅,如果命令沒有參數(shù)的話。
SECONDS
每次引用這個參數(shù)時枫浙,返回 shell 自運行以來的秒數(shù)刨肃。如果向 SECONDS 賦值,此后對它的引用將返回自賦值時起的秒數(shù)加上所賦予的值自脯。如果取消 SECONDS 的定義,它就失去了特殊的意義斤富,即使后來重新定義它膏潮。
SHELLOPTS
一個冒號分隔的被允許的 shell 選項列表。列表中每個詞都是內置命令 set 的 -o 選項的有效參數(shù)满力。 SHELLOPTS 中出現(xiàn)的選項也是 set -o 顯示為 on 的選項焕参。如果 bash 啟動時從環(huán)境中找到這個變量轻纪,那么在讀取任何配置文件之前,列表中的每個選項都將被設置叠纷。這個變量是只讀的刻帚。
SHLVL
每次啟動一個 bash 的實例時都會增加。
UID
擴展為當前用戶的 ID涩嚣,在啟動時初始化崇众。這個變量是只讀的。
下列變量被 shell 使用航厚。有時 bash 會為變量賦默認值顷歌;這些情況在下面會標出。

BASH_ENV
如果 bash 在執(zhí)行一個 shell 腳本時設定了這個變量幔睬,它的值將被解釋為一個文件名眯漩, 包含著初始化 shell 用到的命令,就像 ~/.bashrc 中一樣麻顶。 BASH_ENV 的值在被解釋為一個文件名之前要經(jīng)過參數(shù)擴展赦抖,命令替換和算術擴展。不會使用 PATH 來查找結果文件名辅肾。
CDPATH
命令 cd 的搜索路徑队萤。這是一個冒號分隔的目錄列表,shell 從中查找 cd 命令的目標目錄宛瞄「『蹋可以是這樣: ".:~:/usr".
COLUMNS
用在內建命令 select 當中,用來判斷輸出選擇列表時的終端寬度份汗。 自動根據(jù) SIGWINCH 信號來設置盈电。
COMPREPLY
一個數(shù)組變量,bash 從中讀取可能的命令補全杯活。 它是由命令補全功能調用的 shell 函數(shù)產(chǎn)生的匆帚。
FCEDIT
內建命令 fc 默認的編輯器。
FIGNORE
一個冒號分隔的后綴名列表旁钧,在進行文件名補全時被忽略 (參見下面的 READLINE 章節(jié))吸重。一個后綴滿足其中之一的文件名被排除在匹配的文件名之外⊥峤瘢可以是這樣: ".o:~".
GLOBIGNORE
一個冒號分隔的模式列表嚎幸,定義了路徑名擴展時要忽略的文件名集合。 如果一個文件名與路徑擴展模式匹配寄猩,同時匹配 GLOBIGNORE 中的一個模式時嫉晶,它被從匹配列表中刪除。
HISTCONTROL
如果設置為 ignorespace, 以 space 開頭的行將不會插入到歷史列表中。如果設置為 ignoredups, 匹配上一次歷史記錄的行將不會插入替废。設置為 ignoreboth 會結合這兩種選項箍铭。如果沒有定義,或者設置為其他值椎镣,所有解釋器讀取的行都將存入歷史列表诈火, 但還要經(jīng)過 HISTIGNORE 處理。這個變量的作用可以被 HISTIGNORE 替代状答。多行的組合命令的第二和其余行都不會被檢測活玲,不管 HISTCONTROL 是什么郊霎,都會加入到歷史中。
HISTFILE
保存命令歷史的文件名 (參見下面的 HISTORY 歷史 章節(jié))。默認值是 ~/.bash_history理张。如果取消定義钟病,在交互式 shell 退出時 命令歷史將不會保存谦炒。
HISTFILESIZE
歷史文件中包含的最大行數(shù)积暖。當為這個變量賦值時,如果需要的話孙咪,歷史文件將被截斷 來容納不超過這個值的行堪唐。默認值是 500。歷史文件在交互式 shell 退出時 也會被截斷到這個值翎蹈。
HISTIGNORE
一個冒號分隔的模式列表淮菠,用來判斷那個命令行應當保存在歷史列表中。每個模式 都定位于行首荤堪,必須匹配整行 (沒有假定添加 *')合陵。在 HISTCONTROL 指定的測試結束后,這里的每個模式都要被測試澄阳。除了平常的 shell 模式匹配字符拥知,&' 匹配上一個歷史行。&' 可以使用反斜杠來轉義碎赢;反斜杠在 嘗試匹配之前將被刪除低剔。多行的組合命令的第二行以及后續(xù)行都不會被測試,不管 HISTIGNORE 是什么肮塞,都將加入到歷史中襟齿。 HISTSIZE 命令歷史中保存的歷史數(shù)量 (參見下面的 HISTORY 歷史 章節(jié))。默認值是 500枕赵。 HOME 當前用戶的個人目錄猜欺;內建命令 cd 的默認參數(shù)。在執(zhí)行波浪線擴展時也用到這個變量拷窜。 HOSTFILE 包含一個格式和 /etc/hosts 相同的文件名开皿,當 shell 需要補全主機名時要讀取它钓试。shell 運行過程中 可以改變可能的主機名補全列表;改變之后下一次需要主機名補全時 bash 會將新文件的內容添加到舊列表中副瀑。如果定義了 HOSTFILE 但是沒有賦值,bash 將嘗試讀取 /etc/hosts 文件來獲得可能的主機名補全列表恋谭。當取消 HOSTFILE 的定義時糠睡,主機名列表將清空。 IFS 內部字段分隔符 Internal Field Separator 用來在擴展之后進行分詞疚颊,使用內部命令 read 將行劃分成詞狈孔。默認值是 ``<space><tab><newline>''。 IGNOREEOF 控制交互式 shell 接受到唯一一個 EOF 字符時的行為材义。如果有定義均抽,值是需要在一行的開始連續(xù)輸入 EOF 字符,直到可以使 bash 退出的字符個數(shù)其掂。如果這個變量存在油挥,但是值不是一個數(shù)字或者沒有賦值,默認值是 10款熬。 如果變量沒有定義深寥, EOF 標志著輸入的結束。 INPUTRC readline 的啟動配置文件贤牛,而不是默認的 ~/.inputrc (參見下面的 READLINE 章節(jié))惋鹅。 LANG 用來決定沒有特地用 LC_ 變量指定的語言環(huán)境項。 LC_ALL 這個變量超越了 LANG 和所有其他指定語言環(huán)境項的 LC_ 變量殉簸。 LC_COLLATE 這個變量決定了為路徑擴展的結果排序時的字母順序闰集,決定了范圍表達式的行為, 等價類般卑,和路徑擴展中的歸并順序以及模式匹配武鲁。 LC_CTYPE 這個變量決定了字符的解釋和路徑擴展以及模式匹配中字符類的行為。 LC_MESSAGES 這個變量決定了翻譯以 $ 前導的雙引號字符串時的語言環(huán)境椭微。 LC_NUMERIC 這個變量決定了格式化數(shù)字時的語言環(huán)境分類洞坑。 LINES 內建命令 select 用它來判斷輸出選擇列表時的列寬度。在收到 SIGWINCH 信號時自動設置蝇率。 MAIL 如果這個參數(shù)設置為一個文件名迟杂,并且沒有設置環(huán)境變量 MAILPATH 的話, bash 將在這個文件中通知用戶有郵件到達本慕。 MAILCHECK 指定 bash 檢查郵件的頻率是多少排拷,以秒為單位。默認值是 60 秒锅尘。需要檢查郵件的時候监氢,shell 在顯示提示符之前將進行檢查布蔗。 如果取消它的定義,或者設置為并非大于等于零的數(shù)值浪腐,shell 將禁止郵件檢查纵揍。 MAILPATH 一個冒號分隔的文件名列表,從中檢查郵件议街。當郵件到達某個特殊文件中時泽谨,輸出的特定消息可以 通過將文件名與消息以?' 分隔來指定。 在消息的文本中特漩,$_ 擴展為當前郵件文件的文件名吧雹。例如:
MAILPATH='/var/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"'

Bash 為這個變量提供默認值,但是它使用的用戶郵件文件的位置是系統(tǒng)相關的 (例如涂身,/var/mail/$USER)雄卷。

OPTERR
如果設置為 1, bash 顯示內建命令 getopts 產(chǎn)生的錯誤消息 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))蛤售。每次 shell 啟動時或者一個 shell 腳本被執(zhí)行時 OPTERR 被初始化為 1丁鹉。
PATH
搜索命令的路徑。它是一個冒號分割的目錄列表悴能,shell 從中搜索命令 (參見下面的 命令執(zhí)行(COMMAND EXECUTION) 段落)鳄炉。默認的路徑是系統(tǒng)相關的,是由安裝 bash 的系統(tǒng)管理員設置的搜骡。通常它的值是 /usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.''拂盯。 POSIXLY_CORRECT 如果 bash 啟動環(huán)境中有這個變量,它將在讀取啟動配置文件之前進入 posix mode记靡,就好像提供了 --posix 啟動參數(shù)一樣谈竿。如果 shell 運行過程中設置了它,bash 就啟用 posix mode摸吠,就好像執(zhí)行了 set -o posix 命令一樣空凸。 PROMPT_COMMAND 如果有定義,它的值將作為一個命令寸痢,每次顯示主提示符之前都會執(zhí)行呀洲。 PS1 這個參數(shù)的值被擴展 (參見下面的 PROMPTING 提示符 段落),用作主提示符字符串啼止。默認值是\s-\v$ ''道逗。
PS2
這個參數(shù)的值同 PS1 一起被擴展,用作次提示符字符串献烦。默認值是 > ''滓窍。 PS3 這個參數(shù)的值被用作內建命令 select 的提示符 (參見上面的 SHELL GRAMMAR 語法 章節(jié))。 PS4 這個參數(shù)的值同 PS1 一起被擴展巩那,在執(zhí)行跟蹤中在 bash 顯示每個命令之前顯示吏夯。需要的話此蜈, PS4 的第一個字符會被復制多次,來指示 indirection 的層數(shù)噪生。默認值是+ ''裆赵。
TIMEFORMAT
在前綴 time 保留字的管道中,這個參數(shù)的值用作格式字符串跺嗽, 指定計時信息如何顯示顾瞪。字符 % 引入的轉義序列,被擴展為時間值 或其他信息抛蚁。轉義序列和它們的含義如下所示;括號中是可選的成分惕橙。
%%
一個字面上的 %瞧甩。
%[p][l]R
經(jīng)歷的時間,以秒計算弥鹦。
%[p][l]U
CPU 在用戶模式下執(zhí)行的秒數(shù)肚逸。
%[p][l]S
CPU 在系統(tǒng)模式下執(zhí)行的秒數(shù)。
%P
CPU 使用率彬坏,算法是 (%U + %S) / %R朦促。
可選的 p 是指定精度 (小數(shù)點后數(shù)字位數(shù)) 的數(shù)值。 如果是 0 就不輸出小數(shù)點或小數(shù)值栓始。最多指定到小數(shù)點后三位务冕; 如果 p 大于 3 就會被改為 3。如果沒有指定 p幻赚,默認使用 3禀忆。
可選的 l 指定了長格式,包含分鐘落恼,格式是 MMmSS.FFs箩退。 p 的值決定了是不是包含小數(shù)位。
如果沒有設置這個值佳谦,bash 假定它的值是 $'\nreal\t%3lR\nuser\t%3lU\nsys %3lS'戴涝。 如果它是空值,就不會顯示計時信息钻蔑。顯示格式字符串的時候啥刻,會加上 一個前導的新行符。
TMOUT
如果設置為大于 0 的值咪笑,TMOUT 被當作內建命令 read 的默認超時 等待時間郑什。如果等待終端輸入時, TMOUT 秒之后仍然沒有輸入蒲肋, select 命令將終止蘑拯。在交互的 shell 中钝满,它的值被解釋為顯示了 主提示符之后等待輸入的秒數(shù)。如果經(jīng)過這個秒數(shù)之后仍然沒有輸入申窘, Bash 將退出弯蚜。
auto_resume
這個變量控制了 shell 如何與用戶和作業(yè)控制交互。如果設置了這個變量剃法, 一個不包含重定向的單個詞的簡單命令碎捺,將作為恢復被中斷的作業(yè)的指示。 不允許出現(xiàn)模棱兩可的情況贷洲;如果有多個作業(yè)都以這個詞起始收厨,將恢復最近運行 的作業(yè)。在這種情形下优构,被中斷的作業(yè)的 name 是用于啟動它的命令行诵叁。如果值設置為 exact, 給出的字符串必須精確匹配被中斷的作業(yè)名钦椭;如果設置為 substring拧额, 給出的字符串需要匹配被中斷的作業(yè)名的子串。值 substring 的功能與作業(yè)標識符 %? 功能類似 (參見下面的 JOB CONTROL 作業(yè)控制 章節(jié))彪腔。如果設置為任何其他值侥锦,給出的字符串必須是被中斷的作業(yè)的前綴; 這樣做與作業(yè)標識符 % 功能類似德挣。
histchars
兩到三個字符恭垦,控制著歷史擴展和分段 (tokenization贴见,參見下面的 HISTORY EXPANSION 歷史擴展 章節(jié))探遵。第一個字符是 history expansion(歷史擴展) 字符, 這個字符表明了歷史擴展的開始酗钞,通常是 !'吗浩。 第二個字符是 quick substitution(快速替換) 字符建芙, 它是重新運行上次輸入的命令,但將命令中的字符串替換為另一個的簡寫懂扼, 默認是^'禁荸。可選的第三個字符是指示如果作為一個詞的開始阀湿,那么 一行中剩余字符是注釋赶熟。通常這個字符是 `#'。歷史注釋字符使得 對一行中剩余字符在歷史替換中被跳過陷嘴。它不一定使 shell 解釋器將 這一行的剩余部分當作注釋映砖。

Arrays

Bash 提供了一維數(shù)組變量。任何變量都可以作為一個數(shù)組灾挨;內建命令 declare 可以顯式地定義數(shù)組邑退。數(shù)組的大小沒有上限竹宋,也沒有限制在連續(xù)對成員引用和 賦值時有什么要求。數(shù)組以整數(shù)為下標地技,從 0 開始蜈七。
如果變量賦值時使用語法 name[subscript]=value, 那么就會自動創(chuàng)建數(shù)組莫矗。 subscript 被當作一個算術表達式飒硅,結果必須是大于等于 0 的值。要顯式地定義一個數(shù)組作谚,使用 declare -a name (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))三娩。也可以用 declare -a name[subscript] 這時 subscript 被忽略。數(shù)組變量的屬性可以用內建命令 declare 和 readonly 來指定妹懒。每個屬性對于所有數(shù)組元素都有效雀监。

數(shù)組賦值可以使用復合賦值的方式,形式是 name=(value1 ... valuen)彬伦,這里每個 value 的形式都是 [subscript]=string。string 必須出現(xiàn)伊诵。如果出現(xiàn)了可選的括號和下標单绑,將為這個下標賦值,否則 被賦值的元素的下標是語句中上一次賦值的下標加一曹宴。下標從 0 開始搂橙。 這個語法也被內建命令 declare 所接受。單獨的數(shù)組元素可以用上面介紹的語法 name[subscript]=value 來賦值笛坦。

數(shù)組的任何元素都可以用 ${name[subscript]} 來引用区转。 花括號是必須的,以避免和路徑擴展沖突版扩。如果 subscript 是 @ 或是 废离,它擴展為 name 的所有成員。 這兩種下標只有在雙引號中才不同礁芦。在雙引號中蜻韭,${name[]} 擴展為一個詞, 由所有數(shù)組成員的值組成柿扣,用特殊變量 IFS 的第一個字符分隔肖方;${name[@]} 將 name 的每個成員擴展為一個詞。 如果數(shù)組沒有成員未状,${name[@]} 擴展為空串俯画。這種不同類似于特殊參數(shù) * 和 @ 的擴展 (參見上面的 Special Parameters 段落)。${#name[subscript]} 擴展為 ${name[subscript]} 的長度司草。如果 subscript 是 * 或者是 @艰垂,擴展結果是數(shù)組中元素的個數(shù)泡仗。引用沒有下標數(shù)組變量等價于 引用元素 0。

內建命令 unset 用于銷毀數(shù)組材泄。unset name[subscript] 將銷毀下標是 subscript 的元素沮焕。 unset name, 這里 name 是一個數(shù)組,或者 unset name[subscript], 這里 subscript 是 * 或者是 @拉宗,將銷毀整個數(shù)組峦树。

內建命令 declare, local, 和 readonly 都能接受 -a 選項,從而指定一個數(shù)組旦事。內建命令 read 可以接受 -a 選項魁巩,從標準輸入讀入一列詞來為數(shù)組賦值。內建命令 set 和 declare 使用一種可以重用為輸入的格式來顯示數(shù)組元素姐浮。

擴展(EXPANSION)

命令行的擴展是在拆分成詞之后進行的谷遂。有七種類型的擴展: brace expansion(花括號擴展), tilde expansion(波浪線擴展), parameter and variable expansion(參數(shù)和變量擴展), command substitution(命令替換), arithmetic expansion(算術擴展), word splitting(詞的拆分), 和 pathname expansion(路徑擴展).
擴展的順序是:brace expansion, tilde expansion, parameter, variable 和 arithmetic expansion 還有 command substitution (按照從左到右的順序), word splitting, 最后是 pathname expansion.

還有一種附加的擴展:process subtitution (進程替換) 只有在支持它 的系統(tǒng)中有效。

只有 brace expansion, word splitting, 和 pathname expansion 在擴展前后的詞數(shù)會發(fā)生改變卖鲤;其他擴展總是將一個詞擴展為一個詞肾扰。 唯一的例外是上面提到的 "$@" 和 "${name[@]}" (參見 PARAMETERS參數(shù))。

Brace Expansion

Brace expansion 是一種可能產(chǎn)生任意字符串的機制蛋逾。這種機制類似于 pathname expansion, 但是并不需要存在相應的文件集晚。 花括號擴展的模式是一個可選的 preamble(前導字符), 后面跟著一系列逗號分隔的字符串,包含在一對花括號中区匣, 再后面是一個可選的 postscript(附言)偷拔。 前導被添加到花括號中的每個字符串前面,附言被附加到每個結果字符串之后亏钩, 從左到右進行擴展莲绰。

花括號擴展可以嵌套。擴展字符串的結果沒有排序姑丑;而是保留了從左到右的順序蛤签。 例如, a{d,c,b}e 擴展為 `ade ace abe'栅哀。

花括號擴展是在任何其他擴展之前進行的顷啼,任何對其他擴展有特殊意義的字符 都保留在結果中。它是嚴格字面上的昌屉。 Bash 不會對擴展的上下文或花括號中的文本做任何語義上的解釋钙蒙。

正確的花括號擴展必須包含沒有引用的左括號和右括號,以及至少一個沒有 引用的逗號间驮。任何不正確的表達式都不會被改變躬厌。可以用反斜杠來引用 { 或 , 來阻止將它們識別為花括號表達式的一部分。 為了避免與參數(shù)擴展沖突扛施,字符串 ${ 不被認為有效的組合鸿捧。

這種結構通常用來簡寫字符串的公共前綴遠比上例中為長的情況,例如:

mkdir /usr/local/src/bash/{old,new,dist,bugs}

或者:
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
花括號擴展導致了與歷史版本的 sh 的一點不兼容疙渣。在左括號或右括號作為詞的一部分出現(xiàn)時匙奴, sh 不會對它們進行特殊處理,會在輸出中保留它們妄荔。 Bash 將括號從花括號擴展結果的詞中刪除泼菌。例如,向 sh 輸入 file{1,2} 會導致不變的輸出啦租。同樣的輸入在 bash 進行擴展之后哗伯,會輸出 file1 file2 . 如果需要同 sh 嚴格地保持兼容,需要在啟動 bash 的時候使用 +B 選項篷角,或者使用 set 命令加上 +B 選項來禁用花括號擴展 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))焊刹。

Tilde Expansion

如果一個詞以沒有引用的波浪線字符 (~') 開始,所有 在第一個沒有引用的斜線 (/') 之前的字符 (或者是這個詞的所有字符恳蹲, 如果沒有沒引用的斜線的話) 都被認為是 tilde-prefix(波浪線前綴)虐块。 如果 tilde-prefix 中沒有被引用的字符,那么波浪線之后的字符串 被認為是 login name(登錄名)嘉蕾。如果登錄名是空字符串贺奠,波浪線將 被替換為 shell 參數(shù) HOME 的值。如果沒有定義 HOME荆针, 將替換為執(zhí)行此 shell 的用戶的個人目錄敞嗡。否則颁糟,tilde-prefix 被替換為 與指定登錄名相聯(lián)系的個人目錄航背。

如果 tilde-prefix 是 ~+',將使用 shell 變量 PWD 的值來替換棱貌。如果 tilde-prefix 是~-'玖媚,并且設置了 shell 變量 OLDPWD, 將使用這個變量值來替換。如果在 tilde-prefix 中婚脱,波浪線之后的字符串 由一個數(shù)字 N 組成今魔,前綴可選的 +' 或者-',那么 tilde-prefix 將被替換為目錄棧中相應的元素障贸,就是將 tilde-prefix 作為參數(shù)執(zhí)行內建命令 dirs 顯示的結果错森。如果 tilde-prefix 中波浪線之后的字符是一個數(shù)字,沒有前綴篮洁, 那么就假定有一個 `+'涩维。

如果登錄名不合法,或者波浪線擴展失敗袁波,這個詞將不會變化瓦阐。

在變量賦值中蜗侈,對于 : 或 = 之后的字符串會立即檢查未引用的 tilde-prefix。 這種情況下睡蟋,仍然會進行波浪線擴展踏幻。因此,可以使用帶波浪線的文件名來為 PATH, MAILPATH, 和 CDPATH 賦值戳杀,shell 將賦予擴展之后的值该面。

Parameter Expansion

字符 `$' 引入了參數(shù)擴展,命令替換和算術擴展豺瘤。要擴展的參數(shù)名或符號 可能包含在花括號中吆倦,花括號可選的,但是可以使得要擴展的變量不會與緊隨其后 的字符合并坐求,成為新的名稱蚕泽。

使用花括號的時候,匹配的右括號是第一個 `}'桥嗤,并且它沒有被反斜杠引用 或包含在一個引用的字符串中须妻,也沒有包含在一個嵌入的算術擴展,命令替換 或是參數(shù)擴展中泛领。

${parameter}
被替換為 parameter 的值荒吏。如果 parameter 是一個位置參數(shù),并且數(shù)字多于一位時渊鞋;或者當緊隨 parameter 之后有不屬于名稱一部分的字符時绰更,都必須加上花括號。
如果 parameter 的第一個字符是一個感嘆號锡宋,將引進一層間接變量儡湾。 bash 使用以 parameter 的其余部分為名的變量的值作為變量的名稱; 接下來新的變量被擴展执俩,它的值用在隨后的替換當中徐钠,而不是使用 parameter 自身的值。這也稱為 indirect expansion(間接擴展). 例外情況是下面講到的 ${!prefix*}役首。

下面的每種情況中尝丐,word 都要經(jīng)過波浪線擴展,參數(shù)擴展衡奥,命令替換和 算術擴展爹袁。如果不進行子字符串擴展,bash 測試一個沒有定義或值為空的 參數(shù)矮固;忽略冒號的結果是只測試未定義的參數(shù)失息。

${parameter:-word}
Use Default Values(使用默認值)。如果 parameter 未定義或值為空,將替換為 word 的擴展根时。否則茂浮,將替換為 parameter 的值耍休。
${parameter:=word}
Assign Default Values(賦默認值)顽分。如果 parameter 未定義或值為空觅彰, word 的擴展將賦予 parameter. parameter 的值將被替換。位置參數(shù)和特殊參數(shù)不能用這種方式賦值替裆。
${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 指定的字符串開始恨樟。length 和 offset 是算術表達式 (參見下面的 ARITHMETIC EVALUATION 算術求值 段落)。 length 必須是一個大于等于 0 的數(shù)值嫉柴。如果 offset 求值結果小于 0厌杜, 值將當作從 parameter 的值的末尾算起的偏移量奉呛。如果 parameter 是 @计螺,結果是 length 個位置參數(shù),從 offset 開始瞧壮。 如果 parameter 是一個數(shù)組名登馒,以 @ 或 * 索引,結果是數(shù)組的 length 個成員咆槽,從 ${parameter[offset]} 開始陈轿。 子字符串的下標是從 0 開始的,除非使用位置參數(shù)時,下標從 1 開始麦射。
${!prefix*}
擴展為名稱以 prefix 開始的變量名蛾娶,以特殊變量 IFS 的第一個字符分隔。
${#parameter}
替換為 parameter 的值的長度 (字符數(shù)目)潜秋。如果 parameter 是 * 或者是 @, 替換的值是位置參數(shù)的個數(shù)蛔琅。如果 parameter 是一個數(shù)組名,下標是 * 或者是 @, 替換的值是數(shù)組中元素的個數(shù)峻呛。
${parameter#word}
${parameter##word}
word 被擴展為一個模式罗售,就像路徑擴展中一樣。如果這個模式匹配 parameter 的值的起始钩述,那么擴展的結果是將 parameter 擴展后的值中寨躁,最短的匹配 (#'' 的情況) 或者最長的匹配 (##''的情況) 刪除的結果。如果 parameter 是 @ 或者是 *, 則模式刪除操作將依次施用于每個位置參數(shù)牙勘,最后擴展為結果的列表职恳。如果 parameter 是一個數(shù)組變量,下標是 @ 或者是 *, 模式刪除將依次施用于數(shù)組中的每個成員方面,最后擴展為結果的列表话肖。
${parameter%word}
${parameter%%word}
word 被擴展為一個模式,就像路徑擴展中一樣葡幸。如果這個模式匹配 parameter 擴展后的值的尾部最筒,那么擴展的結果是將 parameter 擴展后的值中,最短的匹配 (%'' 的情況) 或者最長的匹配 (%%''的情況) 刪除的結果蔚叨。如果 parameter 是 @ 或者是 *, 則模式刪除操作將依次施用于每個位置參數(shù)床蜘,最后擴展為結果的列表。如果 parameter 是一個數(shù)組變量蔑水,下標是 @ 或者是 *, 模式刪除將依次施用于數(shù)組中的每個成員邢锯,最后擴展為結果的列表。
${parameter/pattern/string}
${parameter//pattern/string}
patterm 被擴展為一個模式搀别,就像路徑擴展中一樣丹擎。parameter 被擴展,其值中最長的匹配 pattern 的內容被替換為 string歇父。 在第一種形式中蒂培,只有第一個匹配被替換。第二種形式使得 pattern 中所有匹配都被替換為 string榜苫。 如果 pattern 以 # 開始护戳,它必須匹配 parameter 擴展后 值的首部。如果 pattern 以 % 開始垂睬,它必須匹配 parameter 擴展后值的尾部媳荒。如果 string 是空值抗悍,pattern 的匹配都將被刪除, pattern 之后的 / 將被忽略钳枕。如果 parameter 是 @ 或者是 *, 則替換操作將依次施用于每個位置參數(shù)缴渊,最后擴展為結果的列表。如果 parameter 是一個數(shù)組變量鱼炒,下標是 @ 或者是 *, 模式刪除將依次施用于數(shù)組中的每個成員疟暖,最后擴展為結果的列表。

Command Substitution

命令替換 (Command substitution) 允許以命令的輸出替換命令名田柔。有 兩種形式:

$(command)

還有
command
Bash 進行擴展的步驟是執(zhí)行 command俐巴,以它的標準輸出替換它,并且將所有后續(xù)的 新行符刪除硬爆。內嵌的新行符不會刪除欣舵,但是它們可能會在詞的拆分中被刪除。 命令替換 $(cat file) 可以用等價但是更快的方法 $(< file) 代替缀磕。

當使用舊式的反引號 ("``") 替換形式時缘圈,反斜杠只有其字面意義,除非 后面是 $, `, 或者是 . 第一個前面沒有反斜杠的反引號將結束命令替換袜蚕。當使用 $(command) 形式時糟把,括號中所有字符組成了整個命令;沒有被特殊處理的字符牲剃。

命令替換可以嵌套遣疯。要在使用反引號形式時嵌套,可以用反斜杠來轉義內層的 反引號凿傅。

如果替換發(fā)生在雙引號之中缠犀,結果將不進行詞的拆分和路徑擴展。

Arithmetic Expansion

算術擴展允許算術表達式的求值和結果的替換聪舒。算術擴展的格式是:

$((expression))

表達式 expression 被視為如同在雙引號之中一樣辨液,但是括號中的雙引號不會被特殊處理。 表達式中所有詞都經(jīng)過了參數(shù)擴展箱残,字符串擴展滔迈,命令替換和引用的刪除。 算術替換可以嵌套被辑。

求值根據(jù)下面 算術求值(ARITHMETICEVALUATION) 章節(jié)中列出的規(guī)則進行燎悍。如果表達式 expression 非法, bash 輸出錯誤提示消息敷待,不會進行替換间涵。

Process Substitution

Process substitution (進程替換) 只有在支持命名管道 (FIFOs)仁热, 或者支持使用 /dev/fd 方式為打開的文件命名的系統(tǒng)中才可用榜揖。 它的形式是 <(list) 或者是 >(list)勾哩。 進程 list 運行時的輸入或輸出被連接到一個 FIFO 或者 /dev/fd 中的文件。文件的名稱作為一個參數(shù)被傳遞到當前命令举哟,作為擴展的結果思劳。 如果使用 >(list) 形式,向文件寫入相當于為 list 提供輸入妨猩。如果使用 <(list) 形式潜叛,可以讀作為參數(shù)傳遞 的文件來獲得 list 的輸出。

如果可能的話壶硅,進程替換是與參數(shù)和變量擴展威兜,命令替換和算術擴展同時發(fā)生的。

Word Splitting

shell 檢測不在雙引號引用中發(fā)生的參數(shù)擴展庐椒,命令替換和算術擴展的結果椒舵, 進行 word splitting(詞的拆分)。

shell 將 IFS 的每個字符都作為定界符约谈,根據(jù)這些字符來將其他擴展的結果分成詞笔宿。如果 IFS 沒有定義,或者它的值是默認的 <space><tab><newline>, 那么 IFS 字符的任何序列都將作為分界之用棱诱。如果 IFS 的值是默認之外的值泼橘,那么詞開頭和結尾的空白字符 space 和 tab 都將被忽略,只要空白字符在 IFS 的值之內 (即迈勋, IFS 包含空白字符)炬灭。 任何在 IFS 之中但是不是 IFS 空白的字符,以及任何相鄰的 IFS 空白字符靡菇,將字段分隔開來担败。 IFS 空白字符的序列也被作為分界符。如果 IFS 的值是空镰官,不會發(fā)生詞的拆分提前。

顯式給出的空值參數(shù) ("" 或 '') 將被保留。 隱含的空值參數(shù)泳唠,來自于空值的參數(shù)擴展狈网,如果沒有引用則將被刪除。 如果空值的參數(shù)在雙引號引用中擴展笨腥,結果是空值的參數(shù)拓哺,將被保留。

注意如果沒有發(fā)生擴展脖母,不會進行詞的拆分士鸥。

Pathname Expansion

詞的拆分之后,除非設置過 -f 選項谆级, bash 搜索每個詞烤礁,尋找字符 *, ?, 和 [. 如果找到了其中之一讼积,那么這個詞被當作一個 pattern(模式), 被替換為匹配這個模式的文件名以字母順序排列的列表脚仔。如果沒有找到匹配的文件名勤众, 并且 shell 禁用了 nullglob 選項,這個詞將不發(fā)生變化鲤脏。如果設置了 nullglob 選項并且沒有找到匹配们颜,這個詞將被刪除。如果啟用了 nocaseglob 選項猎醇,匹配時將不考慮字母的大小寫窥突。當模式用作路徑名擴展時,字符 .'' 如果在一個名稱的開始或者緊隨一個斜杠之后硫嘶,那么它必須被顯式地匹配波岛,除非設置了 dotglob shell 選項。當匹配一個路徑名時音半,斜杠符必須被顯式地匹配则拷。其他情況下,字符.'' 不會被特殊對待曹鸠。參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 中對 shopt 的介紹煌茬,其中有 shell 選項 nocaseglob, nullglob, 和 dotglob 的描述。

環(huán)境變量 GLOBIGNORE 可以用來限制匹配 pattern 的文件名集合彻桃。如果設置了 GLOBIGNORE坛善, 每個匹配的文件名如果匹配 GLOBIGNORE 中任何一個模式的話將從匹配的列表中刪除。文件名 .'' 和..'' 總是被忽略邻眷,即使設置了 GLOBIGNORE惩坑。 但是萄窜,設置 GLOBIGNORE 和啟用 shell 選項 dotglob 效果是相同的,因此所有其他以 .'' 開頭的文件名將被匹配。要得到原來的行為 (忽略所有以.'' 開頭的文件名)侣集,可以將 ``.*'' 添加為 GLOBIGNORE 的模式之一歧寺。選項 dotglob 被禁用锅锨,如果 GLOBIGNORE 沒有定義時撒穷。

Pattern Matching

任何模式中出現(xiàn)的字符,除了下面描述的特殊模式字符外板惑,都匹配它本身橄镜。 模式中不能出現(xiàn) NUL 字符。如果要匹配字面上的特殊模式字符冯乘,它必須被引用洽胶。

特殊模式字符有下述意義:

匹配任何字符串包含空串。
?
匹配任何單個字符裆馒。
[...]
匹配所包含的任何字符之一姊氓。用一個連字符 (`-') 分隔的一對字符意思是一個 range expression (范圍表達式)丐怯; 任何排在它們之間的字符,包含它們他膳,都被匹配响逢。 排序使用當前語言環(huán)境的字符順序和字符集绒窑。如果 [ 之后的第一個字符是一個 ! 或是一個 ^ 那么任何不包含在內的字符將被匹配棕孙。范圍表達式中字符的順序是由當前語言環(huán)境 和環(huán)境變量 LC_COLLATE 的值 (如果設置了的話) 決定的。一個 - 只有作為集合中第一個或最后一個字符時才能被匹配些膨。一個 ] 只有是集合中第一個字符時才能被匹配蟀俊。
在 [ 和 ] 中,character classes (字符類) 可以用 [:class:] 這樣的語法來指定订雾,這里 class 是在 POSIX.2 標準中定義的下列類名之一:

alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
一個字符類匹配任何屬于這一類的字符肢预。word 字符類匹配字母,數(shù)字和字符 _洼哎。
在 [ 和 ] 中烫映,可以用 [=c=] 這樣的語法來指定 equivalence class (等價類)。它匹配與字符 c 有相同歸并權值 (collation weight噩峦,由當前 語言環(huán)境定義) 的字符锭沟。
在 [ 和 ] 中,語法 [.symbol.] 匹配歸并符號 (collating symbol) symbol识补。

如果使用內建命令 shopt 啟用了 shell 選項 extglob族淮, 將識別另外幾種模式匹配操作符。下面的描述中凭涂,pattern-list 是一個 或多個模式以 | 分隔的列表祝辣。復合的模式可以使用一個或多個下列的 子模式構造出來:

?(pattern-list)
匹配所給模式零次或一次出現(xiàn)
*(pattern-list)
匹配所給模式零次或多次出現(xiàn)
+(pattern-list)
匹配所給模式一次或多次出現(xiàn)
@(pattern-list)
準確匹配所給模式之一
!(pattern-list)
任何除了匹配所給模式之一的字串

Quote Removal

經(jīng)過前面的擴展之后,所有未引用的字符 , ', 以及并非上述擴展結果的字符 " 都被刪除切油。

重定向(REDIRECTION)

在命令執(zhí)行前蝙斜,它的輸入和輸出可能被 redirected (重定向), 使用一種 shell 可以解釋的特殊記法澎胡。重定向也可以用于為當前 shell 執(zhí)行環(huán)境 打開和關閉文件乍炉。下列重定向操作符可以前置或者放在 simple command (簡單命令) 之中的任何位置,或者放在 command 之后滤馍。重定向是以出現(xiàn)的順序進行處理的岛琼,從左到右。
下列描述中巢株,如果文件描述符被忽略槐瑞,并且第一個重定向操作符是 <, 那么重定向指的是標準輸入 (文件描述符是 0)。如果重定向操作符的第一個字符是 >, 那么重定向指的是標準輸出 (文件描述符是 1)阁苞。

下列描述中困檩,重定向操作符之后的詞如果沒有特殊說明祠挫,都要經(jīng)過 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 是一個合法的整數(shù)蝶柿,文件描述符 fd 將被復制。
/dev/stdin
文件描述符 0 被復制非驮。
/dev/stdout
文件描述符 1 被復制交汤。
/dev/stderr
文件描述符 2 被復制。
/dev/tcp/host/port
如果 host 是一個合法的主機名或 Internet 地址劫笙,并且 port 是 一個整數(shù)端口號或服務名芙扎,bash 試圖建立與相應的 socket (套接字) 的 TCP 連接。
/dev/udp/host/port
如果 host 是一個合法的主機名或 Internet 地址填大,并且 port 是 一個整數(shù)端口號或服務名戒洼,bash 試圖建立與相應的 socket (套接字) 的 UDP 連接。
打開或創(chuàng)建文件錯誤將導致重定向出錯栋盹。

Redirecting Input

重定向輸入使得以 word 擴展結果為名的文件被打開并通過文件描述符 n 讀取施逾,如果沒有指定 n 那么就作為標準輸入 (文件描述符為 0) 讀取。

重定向輸入的一般形式是:

[n]<word

Redirecting Output

重定向輸出使得以 word 擴展結果為名的文件被打開并通過文件描述符 n 寫入例获,如果沒有指定 n 那么就作為標準輸出 (文件描述符為 1) 寫入汉额。

重定向的一般形式是:

[n]>word

如果重定向操作符是 >, 并且啟用了內建命令 set 的 noclobber 選項榨汤,那么如果 word 擴展后得到的文件名存在并且是一個普通的文件蠕搜, 重定向將失敗。如果重定向操作符是 >|, 或者重定向操作符是 > 并且沒有啟用內建命令 set 的 noclobber 選項收壕,那么即使 word 得出的文件名存在妓灌,也會嘗試進行重定向。

Appending Redirected Output (添加到重定向后的輸出尾部)

這種方式的輸出重定向使得以 word 擴展結果為名的文件被打開并通過文件描述符 n 從尾部添加蜜宪。如果沒有指定 n 就使用標準輸出 (文件描述符 1)虫埂。如果文件不存在,它將被創(chuàng)建圃验。

重定向的一般形式是:

[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 中的所有行都要經(jīng)過 parameter expansion, command substitution, 和 arithmetic expansion新博。 在后一種情況下薪夕,字符序列 <newline> 被忽略脚草;必須用 \ 來引用字符 , $, 和 `.

如果重定向操作符是 <<-, 那么所有前導的 tab 字符都被從輸入行和包含 delimiter 的行中刪除。這樣使得 shell 腳本中的 here-document 可以被更好地縮進原献。

Here Strings

here-document 的變種馏慨,形式是
<<<word
word 被擴展,提供給命令作為標準輸入姑隅。

Duplicating File Descriptors (復制文件描述符)

重定向操作符

[n]<&word

用于復制文件描述符写隶。如果 word 擴展為一個或多個數(shù)字, n 代表的文件描述符將成為那個文件描述符的復制讲仰。如果 word 中的數(shù)字并未指定一個被用于讀取的文件描述符慕趴,將產(chǎn)生一個重定向錯誤。如果 word 擴展為 -, 文件描述符 n 將被關閉鄙陡。如果沒有指定 n冕房, 將使用標準輸入 (文件描述符 0)。

類似的趁矾,操作符

[n]>&word

用于復制輸出文件描述符耙册。如果沒有指定 n, 將使用標準輸出 (文件描述符 1)毫捣。如果 word 中的數(shù)字并未指定一個被用于輸出的文件描述符详拙,將產(chǎn)生一個重定向錯誤。 特殊情況下蔓同,如果忽略了 n饶辙,并且 word 并非擴展為一個或多個數(shù)字, 標準輸出和標準錯誤將被重定向斑粱,和前面描述的一樣弃揽。

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蒿辙。如果文件不存在拇泛,它將被創(chuàng)建。

別名(ALIASES)

Aliases (別名機制) 允許將一個詞來替換為一個字符串思灌,如果它是 一個簡單命令的第一個詞的話俺叭。shell 記錄著一個別名列表,可以使用 內建命令 alias 和 unalias 來定義和取消 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))泰偿。每個命令的第一個詞熄守,如果沒有引用,都將被檢查是否是一個別名耗跛。 如果是裕照,這個詞將被它所指代的文本替換。別名和替換的文本可以包含任何有效 的 shell 輸入调塌,包含上面列出的 metacharacters (元字符) 晋南,特殊情況是別名中不能包含 =。替換文本的第一個詞也被檢查是否 是別名羔砾,但是如果它與被替換的別名相同负间,就不會再替換第二次。這意味著可以用 ls 作為 ls -F 的別名姜凄, bash 不會遞歸地展開替換文本政溃。如果別名的最后一個字符是 blank, 那么命令中別名之后的下一個詞也將被檢查是否能進行別名展開。
別名可以使用 alias 命令來創(chuàng)建或列舉出來檀葛,使用 unalias 命令來刪除玩祟。

在替換文本中沒有參數(shù)機制。如果需要參數(shù)屿聋,應當使用 shell 函數(shù) (參見下面的 FUNCTIONS (函數(shù)) 段落)空扎。

如果 shell 不是交互的,別名將不會展開润讥,除非使用內建命令 shopt 設置了 expand_aliases 選項转锈。

關于別名的定義和使用中的規(guī)則比較混亂。 Bash 在執(zhí)行一行中的任何命令之前楚殿,總是讀入至少完整一行的輸入撮慨。 別名在命令被讀取時展開,而不是在執(zhí)行的時候。因此砌溺,別名定義如果 和另一個命令在同一行影涉,那么不會起作用,除非讀入了下一行规伐。 別名定義之后蟹倾,同一行中的命令不會受新的別名影響。這種行為 在函數(shù)執(zhí)行時存在爭議猖闪,因為別名替換是在函數(shù)定義被讀取時發(fā)生的鲜棠, 而不是函數(shù)被執(zhí)行的時候,因為函數(shù)定義本身是一個復合命令培慌。結果豁陆, 在函數(shù)中定義的別名只有當這個函數(shù)執(zhí)行完才會生效蚯瞧。為了保險起見炫掐, 應當總是將別名定義放在單獨的一行,不在復合命令中使用 alias颠焦。

不管什么情況下何址,別名都被 shell 函數(shù)超越 (be superseded)里逆。

函數(shù)(FUNCTIONS)

一個 shell 函數(shù)进胯,以上面 SHELLGRAMMAR 中描述的方法定義用爪,保存著一系列的命令,等待稍后執(zhí)行胁镐。 當 shell 函數(shù)名作為一個簡單命令名使用時偎血,這個函數(shù)名關聯(lián)的命令的序列 被執(zhí)行。函數(shù)在當前 shell 的上下文環(huán)境中執(zhí)行盯漂;不會創(chuàng)建新的進程來 解釋它們 (這與 shell 腳本的執(zhí)行形成了對比)颇玷。當執(zhí)行函數(shù)時,函數(shù) 的參數(shù)成為執(zhí)行過程中的位置參數(shù) (positional parameters)就缆。特殊參數(shù) # 被更新以反映這個變化帖渠。位置參數(shù) 0 不會改變。函數(shù)執(zhí)行時竭宰, FUNCNAME 變量被設置為函數(shù)的名稱空郊。函數(shù)和它的調用者在 shell 執(zhí)行環(huán)境的所有 其他方面都是一樣的,特殊情況是 DEBUG 陷阱 (參見下面對內建函數(shù) trap 的描述切揭,在 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié)中) 不會被繼承狞甚,除非函數(shù)設置了 trace 屬性 (參見下面對內建函數(shù) declare 的描述)。
函數(shù)中的局部變量可以使用內建命令 local 來聲明廓旬。通常情況下哼审,變量和它們的值在函數(shù)和它的調用者之間是共享的。

如果函數(shù)中執(zhí)行了內建命令 return, 那么函數(shù)結束涩盾,執(zhí)行從函數(shù)調用之后的下一個命令開始十气。 函數(shù)結束后,位置參數(shù)的值以及特殊參數(shù) # 都將重置為它們在函數(shù)執(zhí)行前的值春霍。

函數(shù)名和定義可以使用內建命令 declare 或 typeset 加上 -f 參數(shù)來列出桦踊。如果在 declare 或 typeset 命令中使用 -F 選項將只列出函數(shù)名。函數(shù)可以使用內建命令 export 加上 -f 參數(shù)導出终畅,使得子 shell 中它們被自動定義籍胯。

函數(shù)可以是遞歸的。對于遞歸調用的次數(shù)沒有硬性限制离福。

算術求值(ARITHMETIC EVALUATION)

在一定的環(huán)境下杖狼,shell 允許進行算術表達式的求值 (參見內建命令 let 和 Arithmetic Expansion (算術表達式))。 求值使用固定寬度的整數(shù)妖爷,不檢查是否溢出蝶涩,但是被零除會被捕獲,標記為錯誤絮识。 操作數(shù)及其優(yōu)先級和聚合程度與 C 語言中相同绿聘。下列操作數(shù)的列表按照相同 優(yōu)先級的操作數(shù)其級別來分組。列出的級別順序是優(yōu)先級遞減的次舌。
id++ id--
變量自增/自減 (在后)
++id --id
變量自增/自減 (在前)

(單目的) 取負/取正
! ~
邏輯和位取反
**
乘冪

  • / %
    乘熄攘,除,取余

加彼念,減
<< >>
左/右位移
<= >= < >
比較
== !=
相等/不等
&
位與 (AND)
^
位異或 (exclusive OR)
|
位或 (OR)
&&
邏輯與 (AND)
||
邏輯或 (OR)
expr?expr:expr
條件求值
= *= /= %= += -= <<= >>= &= ^= |=
賦值
expr1 , expr2
逗號表達式
shell 變量可以作為操作數(shù)挪圾;在表達式求值之前會進行參數(shù)擴展。 在表達式中逐沙,可以用名稱引用 shell 變量哲思,不必使用參數(shù)擴展的語法。 變量被引用時吩案,其值被作為算術表達式來求值棚赔。 shell 變量用于表達式中時,不必啟用整數(shù)屬性徘郭。

以 0 為前導的常量被當作八進制數(shù)靠益,以 0x 或 0X 作為前導表明是十六進制。 其他情況下崎岂,數(shù)字的形式是 [base#]n捆毫,這里 base 是一個 2 到 64 的十進制數(shù)值,作為數(shù)字的基數(shù)冲甘,n 是在這個基數(shù)中數(shù)字的值绩卤。 如果忽略了 base#途样,將以 10 為基數(shù)。大于 10 的數(shù)字依次以小寫字母濒憋, 大寫字母何暇,@ 和 _ 表示。如果 base 小于或等于 36凛驮,在表示 10 與 35 之間 的數(shù)字時小寫字母和大寫字母可以互換裆站。

操作符根據(jù)優(yōu)先級順序進行求值。圓括號中的子表達式被最先求值黔夭,可能會 超越上面的優(yōu)先級規(guī)則宏胯。

條件表達式(CONDITIONAL EXPRESSIONS)

條件表達式用于 [[ 復合命令以及內建命令 test 和 [ 中, 用來測試文件屬性本姥,進行字符串和算術比較肩袍。表達式使用下面的單目或二進制操作構造。 如果某操作的任何 file 參數(shù)的形式是 /dev/fd/n婚惫,那么將檢查 文件描述符 n氛赐。如果某操作的 file 參數(shù)是 /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 存在且可執(zhí)行則為真铃绒。
-O file
如果 file 存在且為有效用戶ID所擁有則為真。
-G file
如果 file 存在且為有效組ID所擁有則為真螺捐。
-L file
如果 file 存在且為符號鏈接則為真颠悬。
-S file
如果 file 存在且為套接字則為真矮燎。
-N file
如果 file 存在且上次讀取后被修改過則為真。
file1 -nt file2
如果 file1 比 file2 要新 (根據(jù)修改日期)赔癌,或者 如果 file1 存在而 file2 不存在诞外,則為真。
file1 -ot file2
如果 file1 比 file2 更舊灾票,或者 如果 file1 不存在而 file2 存在峡谊,則為真。
file1 -ef file2
如果 file1 和 file2 指的是相同的設備和 inode 號則為真刊苍。
-o optname
如果啟用了 shell 選項 optname 則為真既们。參見下面對內建命令 set 的 -o 選項的描述中的選項列表。
-z string
如果 string 的長度為 0 則為真正什。
-n string
string
如果 string 的長度非 0 則為真贤壁。
string1 == string2
如果字符串相等則為真。= 可以用于使用 == 的場合來兼容 POSIX 規(guī)范埠忘。
string1 != string2
如果字符串不相等則為真脾拆。
string1 < string2
如果 string1 在當前語言環(huán)境的字典順序中排在 string2 之前則為真。
string1 > string2
如果 string1 在當前語言環(huán)境的字典順序中排在 string2 之后則為真莹妒。
arg1 OP arg2
OP 是 -eq, -ne, -lt, -le, -gt, 或 -ge 之一名船。這些算術二進制操作返回真,如果 arg1 與 arg2 分別是 相等旨怠,不等渠驼,小于,小于或等于鉴腻,大于迷扇,大于或等于關系。 Arg1 和 arg2 可以是正/負整數(shù)爽哎。

簡單命令擴展(SIMPLE COMMAND EXPANSION)

當執(zhí)行一個簡單命令時蜓席,shell 進行下列擴展,賦值和重定向课锌,從左到右厨内。

解釋器標記為與變量賦值 (在命令名之前的) 和重定向有關的詞被保存等待隨后處理。

并非變量賦值或重定向的詞被擴展渺贤。如果擴展后仍然有詞保留下來雏胃,第一個詞被 作為命令名,其余詞是參數(shù)志鞍。

重定向按照上面 REDIRECTION 中講到的規(guī)則進行瞭亮。

每個變量賦值中 = 之后的文本在賦予變量之前要經(jīng)過波浪線擴展, 參數(shù)擴展固棚,命令替換统翩,算術擴展和引用刪除仙蚜。
如果沒有得到命令名,變量賦值影響當前 shell 環(huán)境唆缴。否則鳍征,變量被加入 被執(zhí)行的命令的環(huán)境中,不影響當前 shell 環(huán)境面徽。如果任何賦值動作試圖 為只讀變量賦值艳丛,將導致出錯,命令以非零狀態(tài)值退出趟紊。

如果沒有得到命令名氮双,重定向仍會進行,但是不影響當前 shell 環(huán)境霎匈。 重定向出錯將使命令以非零狀態(tài)值退出戴差。

如果擴展后有命令名保留下來,那么執(zhí)行過程如下所示铛嘱。否則暖释,命令退出。 如果在任何擴展中包含命令替換墨吓,那么整個命令的退出狀態(tài)是最后一個命令 替換的退出狀態(tài)球匕。如果沒有進行命令替換,命令以狀態(tài)零退出帖烘。

命令執(zhí)行(COMMAND EXECUTION)

命令被拆分為詞之后亮曹,如果結果是一個簡單命令和可選的參數(shù)列表,將執(zhí)行 下面的操作秘症。
如果命令名中沒有斜杠照卦,shell 試圖定位命令位置。如果存在同名的 shell 函數(shù)乡摹,函數(shù)將被執(zhí)行役耕,像上面 FUNCTIONS 中講到的一樣。如果名稱不是一個函數(shù)趟卸,shell 從 內建命令中搜索它蹄葱。如果找到 對應命令,它將被執(zhí)行锄列。

如果名稱既不是 shell 函數(shù)也不是一個內建命令,并且沒有包含斜杠惯悠, bash 搜索 PATH 的每個成員邻邮,查找含有此文件名 (可執(zhí)行文件) 的目錄。 Bash 使用散列表來儲存可執(zhí)行文件的全路徑 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 中的 hash克婶。 只有在散列表中沒有找到此命令筒严,才對 PATH 進行完整的搜索丹泉。如果搜索不成功,shell 輸出錯誤消息鸭蛙,返回退出狀態(tài) 127摹恨。

如果搜索成功,或者命令中包含一個或多個斜杠娶视,shell 在單獨的執(zhí)行環(huán)境中 執(zhí)行這個程序。參數(shù) 0 被設置為所給名稱;命令的其他參數(shù)被設置為所給的參數(shù)樱拴, 如果有的話狮含。

如果執(zhí)行失敗,因為文件不是可執(zhí)行格式孝赫,并且此文件不是目錄较木,就假定它是 一個 shell script (腳本),一個包含 shell 命令的文件青柄。此時將孵化 (spawn) 出一個子 shell 來執(zhí)行它伐债。子 shell 重新初始化自身,效果就好像是 執(zhí)行了一個新的 shell 來處理腳本一樣致开,但是父 shell 保存的命令位置仍然被 保留 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 中的 hash)峰锁。

如果程序是以 #! 開頭的文件,那么第一行的其余部分指定了這個程序的解釋器喇喉。 shell 執(zhí)行指定的解釋器祖今,如果操作系統(tǒng)不會自行處理這種可執(zhí)行文件格式的話。 解釋器的參數(shù)由下面三部分組成:程序第一行中解釋器名稱之后的可選的一個參數(shù)拣技, 程序的名稱千诬,命令行參數(shù),如果有的話膏斤。

命令執(zhí)行環(huán)境(COMMAND EXECUTION ENVIRONMENT)

shell 有 execution environment (執(zhí)行環(huán)境) 的概念徐绑,由下列內容組成:
?
shell 啟動時繼承的打開的文件,例如在內建命令 exec 中使用重定向 修改的結果
?
當前工作目錄莫辨,使用 cd傲茄,pushd 或者 popd 設置,或是由 shell 在啟動時繼承得到
?
文件創(chuàng)建模式掩碼沮榜,使用 umask 設置或是從 shell 的父進程中繼承得到
?
當前陷阱盘榨,用 trap 設置
?
shell 參數(shù),使用變量賦值或者 set 設置蟆融,或者是從父進程的環(huán)境中繼承得到
?
shell 函數(shù)草巡,在執(zhí)行中定義或者是從父進程的環(huán)境中繼承得到
?
設為允許的選項,在執(zhí)行時設置 (要么是默認允許的型酥,要么是命令行給出的) 或者是 用 set 設置
?
用 shopt 設為允許的選項
?
用 alias 定義的 shell 別名
?
各種進程號山憨,包含后臺作業(yè)的進程號查乒,$$ 的值,以及 $PPID 的值
當并非 shell 函數(shù)或內置命令的簡單命令執(zhí)行時郁竟,它在一個由下述內容組成的 單獨的執(zhí)行環(huán)境中啟動玛迄。除非另外說明,值都是從 shell 中繼承的棚亩。

?
shell 打開的文件蓖议,加上對命令使用重定向修改和添加的文件
?
當前工作目錄
?
文件創(chuàng)建模式掩碼
?
標記為導出 (export) 的 shell 變量,以及傳遞到環(huán)境中為這個命令導出的變量
?
shell 捕捉的陷阱被重置為從 shell 的父進程中繼承的值蔑舞,shell 忽略的陷阱 也被忽略
在單獨的環(huán)境中啟動的命令不能影響 shell 的執(zhí)行環(huán)境拒担。

命令替換和異步命令都在子 shell 環(huán)境中執(zhí)行。子 shell 環(huán)境是原有 shell 環(huán)境的賦值攻询,但 shell 捕捉的陷阱被重置為 shell 啟動時從父進程中繼承的值从撼。 作為管道一部分來執(zhí)行的內建命令也在一個子 shell 環(huán)境中執(zhí)行。對子 shell 環(huán)境所作修改不能影響到原有 shell 的執(zhí)行環(huán)境钧栖。

如果命令后面是 & 并且沒有啟用作業(yè)控制低零,命令的默認標準輸入將是空文件 /dev/null。否則拯杠,被執(zhí)行的命令從調用它的 shell 中繼承被重定向修改的 文件描述符掏婶。

環(huán)境(ENVIRONMENT)

當一個程序執(zhí)行時,它被賦予一個字符串數(shù)組潭陪,成為環(huán)境 environment雄妥。 它是一個 名稱-值對 (name-value) 的列表,形式是 name=value.
shell 提供了多種操作環(huán)境的方法依溯。啟動時老厌,shell 掃描自身的環(huán)境,為每個找到 的名字創(chuàng)建一個參數(shù)黎炉,自動地將它標記為 export (向子進程導出的)枝秤。被執(zhí)行的命令繼承了這個環(huán)境。 export 和 declare -x 命令允許參數(shù)和函數(shù)被加入到環(huán)境中或從環(huán)境中刪除慷嗜。如果環(huán)境中參數(shù)的值 被修改淀弹,新值成為環(huán)境的一部分,替換了舊值庆械。所有被執(zhí)行的命令繼承的環(huán)境 包含 shell 的初始環(huán)境 (可能值被修改過)薇溃,減去被 unset 命令刪除的,加上通過 export 和 declare -x 命令添加的部分缭乘。

可以在任何 simple command 或函數(shù)的環(huán)境中設定暫時有效的參數(shù)痊焊,只要將參數(shù)賦值放在命令前面就可以了, 參見上面 PARAMETERS 的描述忿峻。這些賦值語句只在這個命令的環(huán)境中有效薄啥。

如果設置了內建命令 set 的 -k 選項, 所有的 變量賦值都將放到命令的環(huán)境中逛尚,不僅是在命令名前面的那些垄惧。

當 bash 執(zhí)行一個外部命令時,變量 _ 被設置為命令的文件全名绰寞,然后被傳遞到命令的環(huán)境之中到逊。

退出狀態(tài)(EXIT STATUS)

從 shell 的角度看,一個命令退出狀態(tài)是 0 意味著成功退出滤钱。 退出狀態(tài)是 0 表明成功觉壶。非零狀態(tài)值表明失敗。當命令收到 fatal signal N 退出時件缸,bash 使用 128+N 作為它的退出狀態(tài)铜靶。
如果沒有找到命令,為執(zhí)行它而創(chuàng)建的子進程返回 127他炊。如果找到了命令但是 文件不可執(zhí)行争剿,返回狀態(tài)是 126。

如果命令由于擴展或重定向錯誤而失敗痊末,退出狀態(tài)大于零蚕苇。

shell 內建命令如果成功返回 0(true),執(zhí)行時出錯則返回非零 (false)凿叠。 所有內建命令返回 2 來指示不正確的用法涩笤。

Bash 自身返回最后執(zhí)行的命令的退出狀態(tài),除非發(fā)生了語法錯誤盒件, 這時它返回非零值蹬碧。參見下面的內建命令 exit。

信號(SIGNALS)

如果 bash 是交互的履恩,沒有設定任何陷阱锰茉,它忽略 SIGTERM (這樣 kill 0 不會殺掉交互的 shell)。 SIGINT 被捕獲并處理 (從而使內建命令 wait 可以中斷)切心。在所有情況下飒筑, bash 忽略 SIGQUIT。 如果正在使用作業(yè)控制绽昏, bash 忽略 SIGTTIN, SIGTTOU, 和 SIGTSTP.
bash 開始的并行作業(yè)的信號處理句柄都設置為 shell 從父進程中繼承 的值协屡。如果不是正在使用作業(yè)控制,異步命令還忽略 SIGINT 和 SIGQUIT 全谤。 作為命令替換結果運行的命令忽略鍵盤產(chǎn)生的作業(yè)控制信號 SIGTTIN, SIGTTOU, 和 SIGTSTP.

如果收到信號 SIGHUP肤晓, shell 默認退出。在退出前,交互的 shell 向所有作業(yè)补憾,運行的或停止的漫萄,發(fā)送 SIGHUP 信號。shell 向停止的作業(yè)發(fā)出 SIGCONT 信號來保證它們會收到 SIGHUP. 要阻止 shell 向特定的作業(yè)發(fā)送信號盈匾,應當使用內建命令 disown 將作業(yè)從作業(yè)表中刪除 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié)) 或者使用 disown -h 來標記為不接受 SIGHUP腾务。

如果使用 shopt 設置了 shell 選項 huponexit, 在交互的登錄 shell 退出時 bash 向所有作業(yè)發(fā)出 SIGHUP 信號削饵。

當 bash 等待命令執(zhí)行結束時岩瘦,如果收到已設置了陷阱的信號,陷阱 (trap) 將不會執(zhí)行窿撬,直到命令結束启昧。 當 bash 通過內建命令 wait 等待異步命令時,如果收到已設置 了陷阱的信號劈伴,將使得內建命令 wait 立即以大于 128 的狀態(tài)值返回密末。 接著,陷阱將立即被執(zhí)行宰啦。

作業(yè)控制(JOB CONTROL)

Job control (作業(yè)控制) 指的是可以選擇停止 (suspend苏遥,掛起) 進程執(zhí)行,并且 可以在之后繼續(xù) (resume赡模,恢復) 執(zhí)行的能力田炭。用戶一般在交互的人機界面 中使用這種功能。界面是由系統(tǒng)的終端驅動和 bash 共同提供的漓柑。
shell 將每個管道分配給一個 作業(yè)(job)教硫。 它保存一個當前運行的作業(yè)表,可以用 jobs 命令來列出辆布。當 bash 啟動一個異步的作業(yè)時 (background瞬矩,后臺執(zhí)行), 它輸出這樣的一行:

[1] 25647

表明這個作業(yè)的作業(yè)號是 1锋玲,與作業(yè)相關連的管道中最后一個進程的 進程ID是 15647景用。管道中所有進程都是同一個作業(yè)的成員。 Bash 使用 作業(yè)(job) 概念作為作業(yè)控制的基礎惭蹂。

為簡化作業(yè)控制的用戶界面的實現(xiàn)伞插,操作系統(tǒng)負責管理“當前終端的進程組” (current terminal process group ID) 的概念。這個進程組的成員 (進程組 ID 是當前終端進程組 ID 的進程) 可以收到鍵盤產(chǎn)生的信號盾碗,例如 SIGINT. 這些進程被稱為 foreground(前臺的)媚污。 Background (后臺的) 進程是那些進程組 ID 與終端不同的進程;這些進程不會收到鍵盤產(chǎn)生的信號廷雅。 只有前臺進程可以從終端讀或向終端寫耗美。后臺進程試圖讀/寫終端時京髓,將收到終端驅動程序發(fā)送的 SIGTTIN (SIGTTOU) 信號。這個信號如果沒有加以捕捉商架,將掛起這個進程堰怨。

如果 bash 運行其上的操作系統(tǒng)支持作業(yè)控制, bash 會包含使用它的設施甸私。在一個進程正在運行的時候鍵入 suspend 掛起 字符 (通常是 ^Z, Control-Z) 將使這個進程暫停诚些,將控制權還給 bash. 輸入 delayed suspend, 延時掛起 字符 (通常是 ^Y, Control-Y) 將使這個進程在試圖從終端讀取輸入時暫停,將控制權還給 bash. 用戶接下來可以控制此作業(yè)的狀態(tài)皇型,使用 bg 命令使它在后臺繼續(xù)運行, fg 命令使它在前臺繼續(xù)運行砸烦,或 kill 命令將它殺死弃鸦。^Z 會立即起作用,并且還有使等待中的 (pending) 輸出和輸入被忽略的附加副作用幢痘。

有很多方法來指代 shell 中的作業(yè)唬格。字符 % 可以引入作業(yè)名。編號為 n 的作業(yè)可以用 %n 的形式來指代颜说。作業(yè)也可以用啟動它的名稱的前綴购岗,或者命令行中的子字符串來指代。例如门粪, %ce 指代一個暫停的 ce 作業(yè)喊积。如果前綴匹配多于一個作業(yè), bash 報錯玄妈。另一方面乾吻,使用 %?ce, 可以指代任何命令行中包含字符串 ce 的作業(yè)。如果子字符串匹配多于一個作業(yè)拟蜻, bash 報錯绎签。符號 %% 和 %+ 指代 shell 意義上的 current job,當前作業(yè)酝锅, 也就是前臺被暫停的最后一個作業(yè)诡必,或者是在后臺啟動的作業(yè)。 previous job搔扁,前一作業(yè) 可以使用 %- 來指代爸舒。在有關作業(yè)的輸出信息中 (例如,命令 jobs 的輸出)阁谆,當前作業(yè)總是被標記為 +, 前一作業(yè)標記為 -.

簡單地給出作業(yè)名碳抄,可以用來把它放到前臺: %1 是 fg %1'' 的同義詞,將作業(yè) 1 從后臺放到前臺场绿。類似的剖效,%1 &'' 在后臺恢復作業(yè) 1,與 ``bg %1'' 等價。

當某個作業(yè)改變狀態(tài)時璧尸,shell 立即可以得知咒林。通常, bash 等待直到要輸出一個提示符時爷光,才會報告作業(yè)的狀態(tài)變化垫竞,從而不會打斷其他輸出。 如果啟用了內建命令 set 的 -b 選項蛀序, bash 將立即報告這些變化社搅。對 SIGCHLD 信號的陷阱將在每個子進程退出時執(zhí)行溢吻。

如果在作業(yè)暫停時試圖退出 bash, shell 打印一條警告消息。命令 jobs 可能被用來檢查作業(yè)的狀態(tài)拆祈。如果再次試圖退出住诸,中間沒有其他命令长赞,shell 不會打印 其他警告声怔,暫停的作業(yè)將終止。

提示符(PROMPTING)

在交互執(zhí)行時气笙, bash 在準備好讀入一條命令時顯示主提示符 PS1次企, 在需要更多的輸入來完成一條命令時顯示 PS2。 Bash 允許通過插入一些反斜杠轉義的特殊字符來定制這些提示字符串潜圃,這些字符被如下解釋:
\a
一個 ASCII 響鈴字符 (07)
\d
日期缸棵,格式是 "星期 月份 日" (例如,"Tue May 26")
\D{format}
format 被傳遞給 strftime(3)秉犹,結果被插入到提示字符串中蛉谜; 空的 format 將使用語言環(huán)境特定的時間格式〕缍拢花括號是必需的
\e
一個 ASCII 轉義字符 (033)
\h
主機名型诚,第一個 `.' 之前的部分
\H
主機名
\j
shell 當前管理的作業(yè)數(shù)量
\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 的發(fā)行編號,版本號加補丁級別 (例如幔摸,2.00.0)
\w
當前工作目錄
\W
當前工作目錄的基本部分
!
此命令的歷史編號
#
此命令的命令編號
$
如果有效 UID 是 0摸柄,就是 #, 其他情況下是 $
\nnn
對應八進制數(shù) nnn 的字符
\
一個反斜杠
[
一個不可打印字符序列的開始,可以用于在提示符中嵌入終端控制序列
]
一個不可打印字符序列的結束
命令編號和歷史編號通常是不同的:歷史編號是命令在歷史列表中的位置既忆,可能 包含從歷史文件中恢復的命令 (參見下面的 HISTORY 歷史 章節(jié))驱负,而命令編號是當前 shell 會話中執(zhí)行的命令序列中嗦玖,命令的位置。 字符串被解碼之后跃脊,它將進行擴展宇挫,要經(jīng)過 parameter expansion, command substitution, arithmetic expansion 和 quote removal, 最后要經(jīng)過 shell 選項 promptvars 處理 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié)中,對命令 shopt 的描述)酪术。

readline庫(READLINE)

這是在交互 shell 中處理讀取輸入的庫器瘪,除非在 shell 啟動時給出了 --noediting 選項。默認情況下绘雁,行編輯命令類似于 emacs 中的那些橡疼。也可以使用 vi 樣式的行編輯界面。 要在 shell 運行之后關閉行編輯咧七,使用內置命令 set 的 +o emacs 或 +o vi 選項 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))衰齐。
Readline Notation

在這個小節(jié)中,將使用 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 命令可以有數(shù)字的 參數(shù)(arguments)缚柳, 一般作為重復的計數(shù)埃脏。有些時候,它是重要參數(shù)的標記秋忙。給向前方進行的命令 (例如彩掐,kill-line) 傳遞負數(shù)參數(shù),將使得命令向反方向進行灰追。 下面的命令如果接受參數(shù)時的行為與此不同堵幽,將另行說明狗超。

當命令被描述為剪切 (killing) 文本時,被刪除的文本被保存谐檀,等待將來使用 (粘貼抡谐,yanking)。被剪切的文本保存在 kill ring 中桐猬。連續(xù)的剪切使得 文本被依次加入到一個單元中麦撵,可以一次被粘貼。不剪切文本的命令將 kill ring 中的文本分離溃肪。

Readline Initialization 初始化

readline 可以通過將命令放入初始化文件 (inputrc 文件) 來定制免胃。 文件名從變量 INPUTRC 的值中獲取。如果沒有設置這個變量惫撰,默認是 ~/.inputrc. 當使用 readline 庫的程序啟動時羔沙,將讀取初始化文件,按鍵關聯(lián)和變量將被設置厨钻。 readline 初始化文件中只允許有很少的基本構造扼雏。 空行被忽略。以 # 開始的行是注釋夯膀。以 $ 開始的行指示了有條件的構造诗充。 其他行表示按鍵關聯(lián)和變量設置。

默認的按鍵關聯(lián)可以使用 inputrc 文件改變诱建。其他使用這個庫的程序可以添加它們自己的命令和關聯(lián)蝴蜓。

例如,將

M-Control-u: universal-argument


C-Meta-u: universal-argument
放入 inputrc 將使得 M-C-u 執(zhí)行 readline 命令 universal-argument.
可以識別下列字符的符號名稱: RUBOUT, DEL, ESC, LFD, NEWLINE, RET, RETURN, SPC, SPACE, 和 TAB.

在命令名之外俺猿,readline 允許將按鍵與一個字符串關聯(lián)茎匠,當按下這個鍵時,將插入這個字符串 (一個宏押袍,macro)诵冒。

Readline Key Bindings

inputrc 文件中的控制按鍵關聯(lián)的語法非常簡單。需要的內容是命令名或宏伯病,以及它應當關聯(lián)到的按鍵序列造烁。 名稱可以以兩種方式指定:一個按鍵的符號名稱,可能帶有 Meta- 或 Control- 前綴午笛,或者是一個按鍵序列惭蟋。

當使用 keyname:function-name 或 macro 形式時, keyname 是按鍵以英文拼寫的名稱药磺。例如:

Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: "> output"
在上述例子中告组, C-u 被關聯(lián)到函數(shù) universal-argument, M-DEL 被關聯(lián)到函數(shù) backward-kill-word, 而 C-o 被關聯(lián)為運行右邊給出的宏 (意思是,將向行中插入 ``> output'' )癌佩。

在第二種形式中木缝,"keyseq":function-name 或 macro便锨, keyseq 不同于上面的 keyname, 表示整個按鍵序列的字符串可以通過將按鍵序列放在雙引號引用中來指定我碟。 可以使用一些 GNU Emacs 樣式的按鍵序列放案,如下例所示,但是不會識別按鍵的符號名稱矫俺。

"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
"\e[11~": "Function Key 1"
在上述例子中吱殉, C-u 被又一次關聯(lián)到函數(shù) universal-argument. C-x C-r 被關聯(lián)到函數(shù) re-read-init-file, 而 ESC [ 1 1 ~ 被關聯(lián)為插入文本 ``Function Key 1''.

GNU Emacs 樣式的轉義序列的全集為:

\C-
Ctrl 前綴
\M-
Meta 前綴
\e
一個 Esc 字符
\
反斜杠

字面上的 "
'
字面上的 '
除了 GNU Emacs 樣式的轉義序列,還有一系列反斜杠轉義序列可用:

\a
響鈴
\b
回退
\d
刪除
\f
進紙
\n
新行符
\r
回車
\t
水平跳格
\v
豎直跳格
\nnn
一個八比特字符厘托,它的值是八進制值 nnn (一到三個八進制數(shù)字)友雳。
\xHH
一個八比特字符,它的值是十六進制值 HH (一到兩個十六進制數(shù)字)铅匹。
輸入宏的文本時押赊,必須使用單引號或雙引號引用來表明是宏的定義。 沒有引用的文本被當作函數(shù)名包斑。在宏的定義體中流礁,上述反斜杠轉義被擴展。 反斜杠將引用宏文本中所有其他字符罗丰,包括 " 和 '崇棠。

Bash 允許使用內建命令 bind 來顯示和修改當前 readline 按鍵關聯(lián)。在交互使用中可以用內建命令 set 的 -o 選項切換到編輯模式 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))丸卷。

Readline Variables

readline 包含額外的可用于定制它的行為的變量⊙玻可以在 inputrc 文件中設置變量谜嫉,使用如下形式的語句:

set variable-name value

除非另外說明,readline 變量的值總是 On 或 Off凹联。 變量和它們的默認值是:

bell-style (audible)
控制了當 readline 需要鳴終端響鈴時的動作沐兰。如果設置為 none, readline 不會鳴鈴蔽挠。如果設置為 visible住闯,readline 使用可視的響鈴,如果可用的話澳淑。 如果設置為 audible比原,readline 試著鳴終端響鈴。
comment-begin (#'') 這個字符串在執(zhí)行 readline 命令 insert-comment 時被插入杠巡。這個命令在 emacs 模式下被關聯(lián)為 M-#量窘, 在 vi 模式下是 #。 completion-ignore-case (Off) 如果設置為 On氢拥,readline 進行大小寫不敏感的文件名匹配和補全蚌铜。 completion-query-items (100) 這個變量決定著何時向用戶詢問锨侯,是否查看由命令 possible-completions 產(chǎn)生的可能的補全數(shù)量。 它可以設為任何大于或等于 0 的值冬殃。如果可能的補全數(shù)量大于或等于這個變量的值囚痴, 用戶將被提示是否愿意查看它們;否則將直接在終端上列出它們审葬。 convert-meta (On) 如果設置為 On深滚,readline 將把設置了最高位的字符轉換為 ASCII 按鍵序列,方法是 去掉第八位耳璧,前綴一個轉義字符 (實際上成箫,使用 Esc 作為轉義符 meta prefix)。 disable-completion (Off) 如果設置為 On旨枯,readline 將禁止詞的補全蹬昌。補全字符將被插入到行中,就好像它們被 映射為 self-insert攀隔。 editing-mode (emacs) 控制 readline 的按鍵關聯(lián)集合與 emacs 還是 vi 相似皂贩。 editing-mode 可以設置為 emacs 或 vi。 enable-keypad (Off) 如果設置為 On 昆汹,readline 在調用時將試圖啟用輔助鍵盤明刷。 一些系統(tǒng)需要設置這個來啟用方向鍵。 expand-tilde (Off) 如果設置為 On满粗,readline 試圖進行詞的補全時會進行波浪線擴展辈末。 history-preserve-point 如果設置為 On,歷史代碼試著在 previous-history 或 next-history 取回的每個歷史行的相同位置中加點映皆。 horizontal-scroll-mode (Off) 如果設置為 On挤聘,將使得 readline 使用單行來顯示,如果它比屏幕寬度要長捅彻,就在 單一的屏幕行上水平滾動輸入行组去,而不是自動回繞到新行。 input-meta (Off) 如果設置為 On步淹,readline 將允許八比特輸入 (也就是說从隆,它不會將它讀入的字符中最高位刪除), 不管它能支持什么樣的終端要求缭裆。名稱 meta-flag 與此變量同義键闺。 isearch-terminators (C-[C-J'')
用于終止增量的搜索,不再將字符當作命令執(zhí)行的字符串幼驶。 如果這個變量沒有賦值艾杏,字符串 Esc 和 C-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)
這將調整補全函數(shù)的默認行為。如果設置為 on, 擁有多于一個可能的補全的詞將立即列出所有匹配橘沥,而不是鳴響鈴。
visible-stats (Off)
如果設置為 On夯秃,在列出可能的補全時座咆,將在文件名后面添加一個表示文件類型的字符, 文件類型由 stat(2) 報告仓洼。

Readline Conditional Constructs

readline 實現(xiàn)了一種功能介陶,本質上與 C 預處理器進行條件編譯的功能類似, 允許根據(jù)測試的結果進行鍵盤關聯(lián)和變量設置色建。其中使用了四種解釋器指令哺呜。

$if
$if 結構允許根據(jù)編輯模式,正在使用的終端箕戳,使用 readline 的應用程序來設定按鍵關聯(lián)某残。 測試的文本包括一行国撵,直到行尾;不必用字符來隔離它玻墅。
mode
$if 結構的 mode= 形式用于測試 readline 處于 emacs 還是 vi 模式介牙。 這可以與命令 set keymap 結合使用,例如澳厢,設置 emacs-standard 和 emacs-ctlx 鍵盤映射环础,僅當 readline 以 emacs 模式啟動。
term
term= 形式用于包含與終端相關的按鍵關聯(lián)剩拢,也許是將按鍵序列輸出與終端的功能鍵相關聯(lián)线得。 等號 = 右邊的詞被同終端的全名和名稱中第一個 - 前面的一部分相比較。 例如徐伐,允許 sun 同時匹配 sun 和 sun-cmd贯钩。
application
application 結構用于包含應用程序相關的設置。每個使用 readline 的程序都設置 application name呵晨, 初始化文件可以測試它的值魏保。它可用于將一個按鍵序列與對特定的程序有用的功能相關聯(lián)。 例如摸屠,下列命令添加了一個按鍵序列谓罗,用以引用 bash 中當前的詞或前一個詞
$if Bash

Quote the current or previous word

"\C-xq": "\eb"\ef""
$endif
$endif
上例中的這個命令,結束了一個 $if 命令季二。
$else
如果測試失敗檩咱,$if 指令中這個分支的命令將被執(zhí)行。
$include
這個指令使用單個文件名作為參數(shù)胯舷,從文件中讀取命令和按鍵關聯(lián)刻蚯。例如,下列指令 將讀取 /etc/inputrc:
$include /etc/inputrc

Searching

readline 提供了從命令歷史中搜索包含給定字符串的行的命令 (參見下面的 HISTORY 歷史 章節(jié))桑嘶。有兩種搜索模式: incremental 和 non-incremental.

增量的搜索在用戶結束輸入搜索字符串時開始炊汹。在搜索字符串的每個字符被輸入的同時, readline 顯示與已輸入的字符串匹配的下一個歷史條目逃顶。 增量的搜索只要求輸入能找到期望的歷史條目所需的那么多字符讨便。 isearch-terminators 變量中的字符用來終止一次增量的搜索。如果 這個變量沒有被賦值以政,Esc 和 Ctrl-J 字符串將結束一次增量的搜索霸褒。 Ctrl-G 將取消一次增量的搜索,恢復初始的行盈蛮。當搜索終止時废菱,包含搜索字符串 的歷史條目成為當前行。

要從歷史列表中找到其他匹配的條目,適當?shù)劓I入 Ctrl-S 或 Ctrl-R殊轴。 這樣將在歷史中向前/向后搜索下一個匹配已輸入的搜索字符串的條目衰倦。 其他關聯(lián)到某個 readline 命令的按鍵序列將終止搜索并執(zhí)行關聯(lián)的命令。 例如梳凛,newline 將終止搜索耿币,接受當前行,從而執(zhí)行歷史列表中的命令韧拒。

readline 可以記住上次增量搜索的字符串淹接。如果鍵入兩次 Ctrl-R,中間沒有 輸入任何字符來定義一個新的搜索字符串叛溢,那么將使用已記住的搜索字符串塑悼。

非增量的搜索將整個搜索字符串讀入,然后才開始搜索匹配的歷史條目楷掉。 搜索字符串可以由用戶輸入厢蒜,或者是當前行的內容的一部分。

Readline Command Names

下面列出的是命令的名稱以及默認情況下它們關聯(lián)的按鍵序列烹植。 命令名稱如果沒有對應的按鍵序列斑鸦,那么默認是沒有關聯(lián)的。在下列描述中草雕, 點 (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)
向前移動到下一詞尾。詞由字符 (字母和數(shù)字) 組成菌湃。
backward-word (M-b)
向后移動到當前或上一詞首问拘。
clear-screen (C-l)
清除屏幕,保留當前行在屏幕頂端惧所。有參數(shù)時场梆,刷新當前行,不清屏纯路。
redraw-current-line
刷新當前行。

Commands for Manipulating the History 操縱歷史行

accept-line (Newline, Return)
接受這一行寞忿,不管光標在什么位置驰唬。如果行非空,將根據(jù)變量 HISTCONTROL 的狀態(tài)加入到歷史列表中。如果行是修改過的歷史行叫编,將恢復該歷史行到初始狀態(tài)辖佣。
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)
將前一個命令的第一個參數(shù) (通常是上一行的第二個詞) 插入到 point 位置心铃。有參數(shù) n 時,將前一個命令的第 n 個詞 (前一個命令中的詞從 0 開始計數(shù)) 插入到 point 位置挫剑。負數(shù)參數(shù)則插入前一個命令倒數(shù)第 n 個詞去扣。
yank-last-arg (M-., M-)
插入前一個命令的最后一個參數(shù) (上一歷史條目的最后一個詞)。有參數(shù)時樊破, 行為類似于 yank-nth-arg愉棱。后繼的 yank-last-arg 調用將 從歷史列表中向后移動,依次將每行的最后一個參數(shù)插入哲戚。
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)
接受當前行,加以執(zhí)行响蓉,從歷史中取出相對當前行的下一行進行編輯硕勿。 任何參數(shù)都被忽略。
edit-and-execute-command (C-xC-e)
啟動一個編輯器枫甲,編輯當前命令行源武,將結果作為 shell 命令運行。 Bash 將依次試著運行 $FCEDIT, $EDITOR, 和 emacs 作為編輯器想幻。

Commands for Changing Text 改變文本

delete-char (C-d)
刪除 point 處的字符粱栖。如果 point 在行首,行中沒有字符脏毯,最后一次輸入的字符 沒有被關聯(lián)到 delete-char闹究,將返回 EOF.
backward-delete-char (Rubout)
刪除光標之后的字符。當給出一個數(shù)值的參數(shù)時食店,保存刪除的文本到 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 之前的兩個字符。負數(shù)參數(shù)沒有作用恰梢。
transpose-words (M-t)
將 point 之前的詞向前移動佛南,越過 point 處的詞证九,同時也改變 point 的位置。 如果 point 在行尾共虑,將調換行中的最后兩個詞。
upcase-word (M-u)
將當前 (或下一個) 詞變成全大寫呀页。有負值的參數(shù)時妈拌,將前一個詞變?yōu)榇髮懀?但是不移動 point。
downcase-word (M-l)
將當前 (或下一個) 詞變成全小寫蓬蝶。有負值的參數(shù)時尘分,將前一個詞變?yōu)樾懀?但是不移動 point。
capitalize-word (M-c)
將當前 (或下一個) 詞變?yōu)槭鬃执髮懲璺铡S胸撝档膮?shù)時培愁,將前一個詞變?yōu)槭鬃执髮懀?但是不移動 point。
overwrite-mode
控制插入/改寫模式缓窜。給出一個正整數(shù)參數(shù)時定续,切換為改寫模式。給出一個非正數(shù) 參數(shù)時禾锤,切換為插入模式私股。這個命令只影響 emacs 模式;vi 模式 的改寫與此不同恩掷。每個對 readline() 的調用都以插入模式開始倡鲸。在改寫模式下, 關聯(lián)到 self-insert 的字符替換 point 處的字符黄娘,而不是將它推到右邊峭状。 關聯(lián)到 backward-delete-char 的字符以空格替換 point 前的字符。 默認情況下,這個命令沒有關聯(lián)。

Killing and Yanking 剪切和粘貼

kill-line (C-k)
剪切從 point 到行尾的文本啥供。
backward-kill-line (C-x Rubout)
反向剪切到行首颠焦。
unix-line-discard (C-u)
反向剪切到行首。與 backward-kill-line 沒有什么區(qū)別涯捻。 剪切的文本被保存于 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 的文本復制到剪切緩沖區(qū)中。
copy-backward-word
將 point 前面的詞復制到剪切緩沖區(qū)中尼变。 詞的邊界與 backward-word 使用的相同利凑。
copy-forward-word
將 point 之后的詞復制到剪切緩沖區(qū)中。 詞的邊界與 backward-word 使用的相同嫌术。
yank (C-y)
將 kill-ring 頂部的內容粘貼到 point 處的緩沖區(qū)中
yank-pop (M-y)
輪轉 kill-ring哀澈,粘貼新的頂部內容。只能在 yank 或 yank-pop 之后使用度气。

Numeric Arguments 數(shù)值參數(shù)

digit-argument (M-0, M-1, ..., M--)
將這個數(shù)字加入已有的 (already accumulating) 參數(shù)中割按,或者開始新的參數(shù)。 M-- 開始一個否定的參數(shù)磷籍。
universal-argument
這是指定參數(shù)的另一種方法适荣。如果這個命令后面跟著一個或多個數(shù)字, 可能還包含前導的負號择示,這些數(shù)字定義了參數(shù)束凑。如果命令之后跟隨著數(shù)字,再次執(zhí)行 universal-argument 將結束數(shù)字參數(shù)栅盲,但是其他情況下被忽略汪诉。有一種特殊情況,如果命令之后緊接著 一個并非數(shù)字或負號的字符谈秫,下一命令的參數(shù)計數(shù)將乘以 4扒寄。 參數(shù)計數(shù)初始是 1,因此第一次執(zhí)行這個函數(shù)拟烫,使得參數(shù)計數(shù)為 4该编, 第二次執(zhí)行使得參數(shù)計數(shù)為 16,以此類推硕淑。

Completing 補全

complete (TAB)
試著對 point 之前的文本進行補全课竣。 Bash 依次試著將文本作為一個變量 (如果文本以 $ 開始),一個用戶名 (如果文本以 ~ 開始)置媳,主機名 (如果文本以 @ 開始)于樟,或者命令 (以及別名和函數(shù)) 來補全。如果這些都沒有匹配拇囊,將嘗試文件名補全迂曲。
possible-completions (M-?)
列出 point 之前的文本可能的補全。
insert-completions (M-*)
插入 possible-completions 已產(chǎn)生的 point 之前的文本所有的補全寥袭。
menu-complete
與 complete 相似路捧,但是使用可能的補全列表中的某個匹配替換要補全的詞关霸。 重復執(zhí)行 menu-complete 將遍歷可能的補全列表,插入每個匹配杰扫。 到達補全列表的結尾時队寇,鳴終端響鈴 (按照 bell-style 的設置來做) 并恢復初始的文本。 參數(shù) n 將在匹配列表中向前移動 n 步章姓;負數(shù)參數(shù)可以用于在列表中向后移動英上。 這個命令應當與 TAB 鍵關聯(lián),但是默認情況下是沒有關聯(lián)的啤覆。
delete-char-or-list
刪除光標下的字符,如果不是在行首或行尾 (類似 delete-char)惭聂。 如果在行尾窗声,行為與 possible-completions 一致。 這個命令默認沒有關聯(lián)辜纲。
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 函數(shù),shell 內建命令种吸,最后是可執(zhí)行文件名進行匹配弃衍。
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)
重新執(zhí)行上次定義的鍵盤宏,即顯示出宏中的字符破停,好像它們是從鍵盤輸入的一樣翅楼。

Miscellaneous

re-read-init-file (C-x C-r)
讀入 inputrc 文件的內容,合并其中的按鍵關聯(lián)和變量賦值真慢。
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)
撤銷這一行的所有修改。這與執(zhí)行命令 undo 足夠多次的效果相同烛占,將這一行恢復到初始狀態(tài)胎挎。
tilde-expand (M-&)
對當前詞進行波浪線擴展。
set-mark (C-@, M-<space>)
在 point 處設置 mark忆家。如果給出了數(shù)值的參數(shù)呀癣,標記被設置到那個位置。
exchange-point-and-mark (C-x C-x)
交換 point 和 mark弦赖。當前光標位置被設置為保存的位置项栏,舊光標位置被保存為 mark。
character-search (C-])
讀入一個字符蹬竖,point 移動到這個字符下一次出現(xiàn)的地方沼沈。負數(shù)將搜索上一個出現(xiàn)。
character-search-backward (M-C-])
讀入一個字符币厕,point 移動到這個字符上一次出現(xiàn)的地方列另。負數(shù)將搜索下面的出現(xiàn)。
insert-comment (M-#)
沒有數(shù)值的參數(shù)時旦装,readline 變量 comment-begin 的值將被插入到當前行首页衙。如果給出一個數(shù)值的參數(shù),命令的行為類似于一個開關: 如果行首字符不匹配 comment-begin 的值,將插入這個值店乐,否則 匹配 comment-begin 的字符將被從行首刪除艰躺。在兩種情況下,這一行都被接受眨八, 好像輸入了新行符一樣腺兴。comment-begin 的默認值使得這個命令將當前行變成 一條 shell 注釋。如果數(shù)值參數(shù)使得注釋字符被刪除廉侧,這一行將被 shell 執(zhí)行页响。
glob-complete-word (M-g)
point 之前的詞被當作路徑擴展的一個模式,尾部暗含了一個星號段誊。這個模式被用來 為可能的補全產(chǎn)生匹配的文件名列表闰蚕。
glob-expand-word (C-x *)
point 之前的詞被當作路徑擴展的一個模式,匹配的文件名的列表被插入连舍,替換這個詞陪腌。 如果給出一個數(shù)值參數(shù),在路徑擴展之前將添加一個星號烟瞧。
glob-list-expansions (C-x g)
顯示 glob-expand-word 可能產(chǎn)生的擴展的列表,重繪當前行染簇。如果給出一個數(shù)值參數(shù)参滴,在路徑擴展之前將添加一個星號。
dump-functions
向 readline 輸出流打印所有的函數(shù)和它們的按鍵關聯(lián)锻弓。如果給出一個數(shù)值參數(shù)砾赔, 輸出將被格式化,可以用作 inputrc 文件一部分青灼。
dump-variables
向 readline 輸出流打印所有可設置的 readline 函數(shù)暴心。如果給出一個數(shù)值參數(shù), 輸出將被格式化杂拨,可以用作 inputrc 文件一部分专普。
dump-macros
向 readline 輸出流打印所有關聯(lián)到宏的 readline 按鍵序列以及它們輸出的字符串。 如果給出一個數(shù)值參數(shù)弹沽,輸出將被格式化檀夹,可以用作 inputrc 文件一部分。
display-shell-version (C-x C-v)
顯示當前 bash 實例的版本信息策橘。

Programmable Completion 可編程補全

當試圖對一個命令的參數(shù)進行詞的補全時炸渡,如果已經(jīng)使用內建命令 complete 定義了這個命令的補全規(guī)則 ( compspec),將啟動可編程補全功能 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))丽已。

首先蚌堵,命令名被確認。如果針對這個命令有補全規(guī)則的定義,那么將使用 規(guī)則來產(chǎn)生可能的詞的補全的列表吼畏。如果命令詞是一個路徑全名督赤,將首先搜索 針對這個路徑全名的規(guī)則。如果針對這個路徑全名沒有找到規(guī)則宫仗,將嘗試查找 針對最后一個斜杠后面的部分的規(guī)則够挂。

一旦找到了一個規(guī)則,它將用作產(chǎn)生匹配的詞藕夫。如果沒有找到孽糖,將進行上面 Completing 中描述的 bash 默認的補全。

首先毅贮,將執(zhí)行規(guī)則指定的動作办悟。只有以被補全的詞開始的匹配詞才會被返回。 當在文件或目錄名補全中使用 -f 或 -d 選項時滩褥,shell 變量 FIGNORE 將用于對匹配進行過濾病蛉。

接下來,將產(chǎn)生所有由-G 選項給出的文件名擴展模式指定的補全瑰煎。 模式產(chǎn)生的詞不必匹配要補全的詞铺然。shell 變量 GLOBIGNORE 不會用于過濾匹配結果,但是變量 FIGNORE 會被使用酒甸。

接下來魄健,將考慮 -W 選項的參數(shù)指定的字符串。這個字符串首先被 劃分插勤,用特殊變量 IFS 中的字符作為分隔符沽瘦。shell 引用被當作一個詞。 接下來农尖,每個詞被擴展析恋,使用上面 EXPANSION 中描述的 brace expansion, tilde expansion, parameter 和 variable expansion, command substitution, arithmetic expansion, 以及 pathname expansion 規(guī)則處理。對于結果盛卡,再使用上面 Word Splitting 中描述的規(guī)則劃分成詞助隧。 擴展的結果與要補全的詞進行前部一致的比較,匹配的詞成為可能的補全滑沧。

在這些匹配被產(chǎn)生后喇颁,任何由 -F 和 -C 選項指定的 shell 函數(shù)和命令將被執(zhí)行。當命令或函數(shù)被執(zhí)行時嚎货,變量 COMP_LINE 和 COMP_POINT 被賦值橘霎,使用上面 Shell Variables 中的規(guī)則。 如果要執(zhí)行 shell 函數(shù)殖属,還將設置變量 COMP_WORDS 和 COMP_CWORD 當函數(shù)或命令被執(zhí)行時姐叁,第一個參數(shù)是等待參數(shù)被補全的命令的名稱, 第二個參數(shù)是要補全的詞,第三個參數(shù)是當前命令行中外潜,要補全的詞前面的詞原环。 對要補全的詞產(chǎn)生的補全不會進行任何過濾;函數(shù)或命令在產(chǎn)生匹配時有完全的自由处窥。

任何 -F 指定的函數(shù)將被首先執(zhí)行嘱吗。函數(shù)可以使用任何 shell 功能, 包含內建命令 compgen滔驾,來產(chǎn)生匹配削锰。它必須將可能的補全放到數(shù)組變量 COMPREPLY 中扁眯。

接下來帽芽,任何 -C 選項指定的命令將被執(zhí)行摄咆,其執(zhí)行環(huán)境與命令替換 的環(huán)境相同。它應當向標準輸出打印一個補全的列表摊阀,每行一個耻蛇。 反斜杠可以用來轉義一個新行符,如果需要的話胞此。

所有可能的補全都產(chǎn)生之后臣咖,將對列表進行 -X 選項指定的任何過濾。 過濾器是一個模式漱牵,和路徑名擴展中的一樣夺蛇;模式中的 & 替換為 要補全的詞。字面上的 & 可以用反斜杠轉義布疙;反斜杠在進行匹配時被刪除。 任何匹配這個模式的補全將從列表中刪除愿卸。前導的 ! 將使模式含義相反灵临; 這種情況下,任何不匹配這個模式的補全將被刪除趴荸。

最后儒溉,B-P 和 -S 指定的任何前綴和后綴被添加到補全列表的每個 成員后面,結果返回給 readline 補全代碼发钝,作為可能的補全列表顿涣。

如果先前執(zhí)行的動作沒有產(chǎn)生任何匹配,并且在定義 compspec 規(guī)則時酝豪,為 complete 命令提供了 -o dirname 選項涛碑,將嘗試目錄名補全。

默認情況下孵淘,如果找到了一個規(guī)則蒲障,它產(chǎn)生的任何東西都被返回給補全代碼, 作為可能的補全的全集。不再嘗試默認的 bash 補全揉阎,readline 默認的 文件名補全也會禁止庄撮。如果定義規(guī)則時,為 complete 命令提供了 -o default 選項毙籽,在規(guī)則沒有產(chǎn)生匹配時將進行 readline 默認的補全處理洞斯。

當一個規(guī)則指出期望目錄名補全時,可編程補全函數(shù)強制 readline 在補全的名稱 后面添加一個斜杠坑赡,如果它是一個到目錄的符號連接烙如。然后還要經(jīng)過 readline 變量 mark-directories 的值處理,不管 readline 變量 mark-symlinked-directories 的值是什么垮衷。

歷史(HISTORY)

當啟用內建命令 set 的 -o history 選項時厅翔,shell 允許訪問 command history,以前輸入的命令的列表搀突。 HISTSIZE 的值用作命令列表中保存的命令數(shù)量刀闷。 過去 HISTSIZE 個 (默認為500) 命令將被保存。shell 將每條命令在進行參數(shù)和變量擴展之前 保存到歷史列表中 (參見上面的 EXPANSION 段落)仰迁,但是是在歷史擴展進行之后甸昏,并且要經(jīng)過 shell 變量 HISTIGNORE 和 HISTCONTROL 處理。
在啟動時徐许,歷史根據(jù)以變量 HISTFILE 的值為名的文件 (默認是 ~/.bash_history) 進行初始化施蜜。 如果需要的話,以 HISTFILE 為名的文件將被截斷雌隅,來包含不超過變量 HISTFILESIZE 的值指定的行數(shù)翻默。當交互 shell 退出時,最后 $HISTSIZE 行被從歷史列表中復制到 $HISTFILE 文件中恰起。如果啟用了 shell 選項 histappend (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié)中對內建命令 shopt 的描述)修械,這些行被追加到歷史文件中,否則歷史文件被覆蓋检盼。如果 HISTFILE 被取消定義肯污,或者如果歷史文件不可寫,歷史將不會保存吨枉。保存歷史之后蹦渣, 歷史文件被截斷,以包含不超過 HISTFILESIZE 行貌亭。如果 HISTFILESIZE 被取消定義柬唯,不會進行截斷操作。

內建命令 fc (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié)) 可以用來列出或修改并重新執(zhí)行歷史列表中的一部分圃庭。內建命令 history 可以用來顯示或修改歷史列表权逗,操作歷史文件美尸。當使用命令行編輯時,每種 編輯模式都有搜索命令斟薇,提供對歷史列表的訪問师坎。

shell 允許控制哪些命令被保存到歷史列表中】氨酰可以設置 HISTCONTROL 和 HISTIGNORE 變量胯陋,來使得 shell 只保存輸入命令的一個子集。shell 選項 cmdhist 如果被啟用袱箱,將使得 shell 將多行的命令的每一行保存到同一個歷史條目中遏乔, 在需要的地方添加分號來保證語義的正確性。shell 選項 lithist 使得 shell 保存命令時发笔,保留嵌入的新行而不是用分號代替盟萨。參見下面 shell 內建命令(SHELL BUILTIN COMMANDS) 中,內建命令 shopt 的描述了讨,有關設置和取消 shell 選項的信息捻激。

歷史擴展(HISTORY EXPANSION)

shell 支持歷史擴展機制,類似于 csh 中歷史擴展前计。這一節(jié)描述了可用的語法特征胞谭。在交互的 shell 中這一機制被默認啟用, 可以使用內建命令 set 的 -H 選項來禁用它 (參見下面的 shell 內建命令(SHELL BUILTIN COMMANDS) 章節(jié))男杈。非交互的 shell 默認不進行歷史擴展丈屹。

歷史擴展將歷史列表中的詞引入輸入流中,使得可以方便地重復已執(zhí)行命令伶棒, 在當前輸入行中為前一個命令插入新的參數(shù)旺垒, 或者快速修正前一個命令中的錯誤。

歷史擴展在讀入一整行后肤无,在 shell 將它拆分成詞之前立即進行先蒋。它 由兩部分組成。首先是判斷替換中使用歷史列表中哪一行舅锄。其次是選擇那一行中要包含到當前行中的部分鞭达。 從歷史中選擇的行稱為 event司忱,從那一行中選擇的部分是 words皇忿。 可以用多種多樣的 modifiers 來操縱所選的詞。在讀入輸入時坦仍,行被按照同樣方式分解成詞鳍烁, 因此多個以 metacharacter 分隔的詞,如果被引號包含繁扎,就被當成一個詞幔荒。 歷史擴展由歷史擴展字符引入糊闽,默認是 !。只有反斜杠 () 和單引號可以引用歷史擴展字符爹梁。

內建命令 shopt 可以設定多個選項值右犹,來調整歷史擴展的行為。如果 shell 選項 histverify 被啟用 (參見內建命令 shopt 的描述)姚垃,并且正在使用 readline念链, 歷史替換不會被立即傳給 shell 解釋器。與此相對积糯,擴展后的行被重新載入 readline 編輯緩沖區(qū)掂墓,進行進一步的修改。如果正在使用 readline看成, 并且啟用了 shell 選項 histreedit君编, 失敗的歷史替換將被重新載入到 readline 編輯緩沖區(qū),進行改正川慌。內建命令 history 的 -p 選項可以用來在執(zhí)行之前查看歷史擴展將如何進行吃嘿。內建命令 history 的 -s 選項可以用來在歷史列表末尾添加命令,而不真正執(zhí)行它們窘游,從而 在接下來的調用中可以使用它們唠椭。

shell 允許控制歷史擴展機制使用的多種字符 (參見上面的 Shell Variables 中 histchars 的描述)。

Event Designators

事件指示器 (event designator) 是一個對歷史列表中某個命令行條目的引用忍饰。

!
開始一個命令替換贪嫂,除非后面跟隨的是 blank, newline, = 或是 (.
!n
引用命令行 n.
!-n
引用當前命令行減去 n.
!!
引用上一條命令。這是 `!-1' 的同義詞艾蓝。
!string
引用最近的以 string 開始的命令力崇。
!?string[?]
引用最近的包含 string 的命令。尾部的 ? 可以被忽略赢织,如果 string 之后緊接著一個新行符亮靴。
string1string2^
快速替換。重復上一條命令于置,將 string1 替換為 string2. 與 ``!!:s/string1/string2/'' 等價 (參見下面的 修飾符 (Modifiers))茧吊。
!#
到此為止輸入的整個命令行。

Word Designators

詞指示器 (word designator) 用于從 event 中選擇期望的詞八毯。 : 分隔 event 規(guī)則與 word 指示器搓侄。它可以忽略,如果詞指示器以 ^, $, *, -, 或 % 開始话速。詞被從行首開始編號讶踪,第一個詞被表示為 0。插入當前行中的詞以單個空格分隔泊交。

0 (zero)
第 0 個詞乳讥。對 shell 來將柱查,這是命令名。
n
第 n 個詞云石。
^
第一個參數(shù)唉工。也就是,第 1 個詞汹忠。
$
最后的參數(shù)酵紫。
%
最近一次搜索 ?string?' 匹配的詞。 x-y 一組詞错维;-y' 是 `0-y' 的簡寫奖地。

所有詞,除了第 0 個赋焕。這是 `1-$' 的同義詞参歹。如果 event 中只有一個詞,使用 * 也不是錯誤隆判;這種情況下將返回空字符串犬庇。
x*
x-$ 的簡寫。
x-
-$ 的簡寫侨嘀,就像 x* 一樣臭挽,但是忽略最后一個詞。
如果給出了一個 word 指示器咬腕,沒有給出 event 規(guī)則欢峰,前一個命令將用作 event。

修飾符 (Modifiers)

可選的 word 指示器之后涨共,可以出現(xiàn)一個或多個下述 modifiers 的序列纽帖,每一個都前綴有 `:'。

h
刪除文件名組成的尾部举反,只保留頭部懊直。
t
刪除文件名組成中前面的成分,保留尾部火鼻。
r
刪除 .xxx 形式中尾部的后綴成分室囊,保留基本名稱部分。
e
刪除所有內容魁索,保留尾部的后綴融撞。
p
打印新的命令,但是不執(zhí)行它蛾默。
q
引用替換所得的詞懦铺,使它不再進行替換捉貌。
x
引用替換所得的詞支鸡,類似與 q, 但是會根據(jù) blanks冬念,空白 和新行符分解為詞。
s/old/new/
將事件行中出現(xiàn)的第一個 old 替換為 new牧挣。 任何分隔符都可以用來代替 /急前,最后一個分隔符是可選的,如果它是事件行的最后一個字符瀑构。 old 和 new 中的分隔符可以用一個反斜杠來引用裆针。如果 & 出現(xiàn)在 new 中,它將替換為 old寺晌。 可以用單個反斜杠來引用 &世吨。如果 old 為空,它將設置為最后替換的 old呻征, 或者耘婚,如果前面沒有發(fā)生過歷史替換,就是 !?string[?] 搜索中的最后一個 string陆赋。
&
重復上一次替換沐祷。
g
使得改變被整個事件行所接受。用于與 :s' 或:&' 結合 (例如攒岛,:gs/old/new/')赖临。 如果與:s' 結合使用,任何分隔符都可以用來代替 /灾锯, 最后一個分隔符是可選的兢榨,如果它是事件行的最后一個字符。

shell 內建命令(SHELL BUILTIN COMMANDS)

除非另外說明顺饮,這一章介紹的內建命令如果接受 - 引導的選項色乾,那么它也接受 -- 作為參數(shù),來指示選項的結束

: [arguments]
沒有效果领突;這個命令除了擴展 arguments 并且作任何指定的重定向之外暖璧,不做任何事。 退出時返回0君旦。
. filename [arguments]
source filename [arguments]
讀取并在當前 shell 環(huán)境中執(zhí)行 filename 中的命令澎办,返回 filename 中最后一個命令的返回狀態(tài)。如果 filename 中不包含斜杠 (slash)金砍,系統(tǒng)將在 PATH 中查找包含 filename 的目錄局蚀。在 PATH 中搜索的文件不必是可執(zhí)行的次屠。 如果 bash 不是運行于 posix mode棵介,當 PATH 中找不到文件時會在當前目錄搜索。如果 shopt 內建命令的 sourcepath 選項被關閉仗考, PATH 將不會被搜索鹅巍。如果有任何 arguments 千扶,它們成為 filename 的位置參數(shù) (positional parameters)料祠,否則 位置參數(shù)不發(fā)生變化。 返回狀態(tài)是腳本中最后一個命令退出時的狀態(tài)澎羞。 沒有執(zhí)行命令則返回0髓绽,沒有找到或不能讀取 filename 時返回false。
alias [-p] [name[=value] ...]
Alias 不帶參數(shù)或者帶 -p 參數(shù)運行時將在標準輸出以這樣的格式 alias name=value 給出別名列表妆绞。 如果有參數(shù)顺呕,將創(chuàng)建提供了 value 的 name 的別名。 value 中尾部的空格使得別名被擴展時括饶,下一個詞做別名替換株茶。 對于參數(shù)列表中的每一個 name,如果 value 沒有 給出图焰,這個別名的名稱和值會被打印出來忌卤。 Alias 返回 true 除非 name 沒有定義為別名。
bg [jobspec]
使掛起的程序 jobspec 在后臺繼續(xù)執(zhí)行楞泼,就好像它是用 & 啟動的一樣驰徊。如果沒有指定 jobspec,shell 意義上的 current job 當前作業(yè) 將被使用堕阔。 bg jobspec 返回0棍厂,除非當前禁止了作業(yè)控制,或者在允許作業(yè)控制超陆,但 是沒有找到 jobspec 牺弹,或者它不是在作業(yè)控制下啟動的時候。
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 功能或宏進行關聯(lián)张漂,或者設置一個 readline 變量。每一個在非選項的參數(shù)都是一個命令谨娜,好像它是在 .inputrc 中出現(xiàn)的一樣航攒。但是每個關聯(lián)或者命令必須作為單獨的參數(shù)傳遞; 也就是這樣 '"\C-x\C-r": re-read-init-file'趴梢。 如果有參數(shù)漠畜,它們有如下的意義:
-m keymap
使用 keymap 作為隨后的關聯(lián)的keymap∥氚校可選的 keymap 名稱是 emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command憔狞,還有 vi-insert。 vi 和 vi-command 等價; emacs 和 emacs-standard 等價彰阴。
-l
列出所有的 readline 功能瘾敢。
-p
以程序可讀的方式顯示 readline 功能名稱和關聯(lián)
-P
列出當前 readline 功能名稱和關聯(lián)。
-v
以程序可讀的方式顯示 readline 變量名稱和值
-V
列出當前 readline 變量和值。
-s
以程序可讀的方式顯示 readline 鍵序列和對應的宏
-S
顯示 readline 宏對應的鍵序列和他們輸出的字符串
-f filename
從 filename 中讀取鍵序列
-q function
查詢那些鍵將執(zhí)行function簇抵。
-u function
取消所有關聯(lián)到 function 的鍵庆杜。
-r keyseq
取消當前任何 keyseq 的關聯(lián)。
-x keyseq:shell-command
使 shell-command 在 keyseq 按下時被執(zhí)行正压。
返回值是0,除非給出了一個不能識別的選項或是產(chǎn)生了一個錯誤责球。

break [n]
從一個 for, while, until, 或者 select 循環(huán)退出焦履。 如果指定了 n ,就跳出 n 層循環(huán)雏逾。 n 必須 ≥ 1嘉裤。如果 n 比當前循環(huán)層數(shù)還要大,將跳出所有循環(huán)栖博。 返回值是0屑宠,除非執(zhí)行 break 的時候 shell 不是在執(zhí)行一個循環(huán)。
builtin shell-builtin [arguments]
執(zhí)行指定的 shell 內建命令仇让,傳遞 arguments 典奉,返回命令的返回值。 這在定義了一個和 shell 內建命令同名的函數(shù)時很有用丧叽, 在那個函數(shù)中使用它來執(zhí)行相應的功能卫玖。cd 命令常以這種方式重新定義。 返回狀態(tài)是 false踊淳,如果指定的 shell-builtin 并不是一個 shell 內建命令假瞬。
cd [-L|-P] [dir]
改變當前路徑到 dir。這個變量的默認值是 HOME 目錄迂尝。環(huán)境變量 CDPATH 定義了包含 dir 的搜索路徑脱茉。在 CDPATH 中可選的路徑名以冒號(:) 分隔。 CDPATH 中的空路徑名與當前路徑相同垄开,就是 ``.''. 如果 目錄名 以斜杠 (/,slash) 起始琴许,那么 CDPATH 不會被使用。 -P 選項是說使用物理路徑結構而不是跟隨符號鏈接溉躲,(參見 set 命令中的 -P 選項); -L 選項強制跟隨符號鏈接虚吟。另外,選項 - 與 $OLDPWD 是相同的签财。 返回值是 true 串慰,如果成功地改變了目錄;否則是 false唱蒸。
command [-pVv] command [arg ...]
運行 command 邦鲫,使用 args 作為參數(shù),禁止通常的查找 shell 函數(shù)的過程。只有內建命令或者 PATH 中包含的命令可以執(zhí)行庆捺。如果給出 -p 參數(shù)古今, command 的查找是以 PATH 的默認值進行的。這樣可以保證找到所有的標準工具滔以。如果給出 -V 或者 -v 選項捉腥,關于 command 的說明將被打印出來。 -v 選項使得表述這個命令的詞你画,或者要執(zhí)行 command 需要執(zhí)行的文件顯示出來抵碟; -V 選項給出更詳細的描述。如果給出 -V 或者 -v 選項坏匪,退出狀態(tài)在找到了 command 的情況下0拟逮,沒找到就是1。 如果沒有提供選項适滓,并且產(chǎn)生了錯誤或者 command 沒有找到敦迄,退出狀態(tài)就是127。否則凭迹, command 內建命令的退出狀態(tài)是 command 的退出狀態(tài)罚屋。
compgen [option] [word]
根據(jù) option 為 word 產(chǎn)生可能的補全。option 是 內建命令 complete 接受的任何選項嗅绸,除了 -p 和 -r沿后,將匹配結果寫到標準輸出。 當使用 -F 或 -C 選項時朽砰,可編程補全功能所設置的多數(shù) shell 變量如果存在尖滚,其值將不再有用。
產(chǎn)生的匹配與可編程補全代碼根據(jù)補全規(guī)則加上相同的標志直接產(chǎn)生的結果相同瞧柔。 如果指定了 word漆弄,只有匹配 word 的補全結果將被顯示出來。

返回值為真造锅,除非提供了非法的選項撼唾,或者沒有產(chǎn)生匹配。

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 的參數(shù)應當如何被補全哥蔚。如果給出了 -p 選項倒谷, 或者沒有選項給出,現(xiàn)有的補全規(guī)則將被顯示出來糙箍,以一種可以重用為輸入 的格式顯示渤愁。-r 選項將一個針對每個 name 的補全規(guī)則刪除。 或者深夯,如果沒有給出 name抖格,將刪除所有補全規(guī)則诺苹。
嘗試詞的補全時,應用這些補全規(guī)則的過程在上面 Programmable Completion(可編程補全) 中詳述雹拄。

其他選項收奔,如果給出的話,具有下列意義滓玖。-G, -W, 和 -X 選項的參數(shù) (如果需要的話坪哄,還包括 -P 和 -S 選項) 應當被引用,避免在執(zhí)行內建命令 complete 之前被擴展势篡。

-o comp-option
comp-option 控制著 compspec 除了簡單地產(chǎn)生補全之外的多種行為翩肌。 comp-option 可以是如下之一:
default
使用 readline 的默認文件名補全,如果 compspec 沒有得到匹配殊霞。
dirnames
進行目錄名補全摧阅,如果 compspec 沒有得到匹配汰蓉。
filenames
告訴 readline绷蹲,compspec 產(chǎn)生了文件名,使它可以進行任何文件名專用的處理 (例如顾孽,給目錄名加上斜杠或消除尾部空白)祝钢。主要用于 shell 函數(shù)。
nospace
告訴 readline 不要向補全的詞在行的最后添加一個空格 (這是默認行為)若厚。
-A action
action 可以是下列之一拦英,來產(chǎn)生一系列可能的補全結果:
alias
起別名。也可以用 -a 指定测秸。
arrayvar
數(shù)組變量名疤估。
binding
Readline 按鍵關聯(lián)。
builtin
shell 內建命令的名稱霎冯。也可以用 -b 指定铃拇。
command
命令名。也可以用 -c 指定沈撞。
directory
目錄名慷荔。也可以用 -d 指定。
disabled
被禁用的內建命令名稱缠俺。
enabled
啟用的內建命令名稱显晶。
export
被導出的 shell 變量名稱。也可以用 -e 指定壹士。
file
文件名磷雇。也可以用 -f 指定。
function
shell 函數(shù)的名稱躏救。
group
組名倦春。也可以用 -g 指定。
helptopic
內建命令 help 接受的幫助主題。
hostname
主機名睁本,從環(huán)境變量 HOSTFILE 指定的文件中得到尿庐。
job
作業(yè)名,如果作業(yè)控制被激活的話呢堰。也可以用 -j 指定抄瑟。
keyword
shell 保留字。也可以用 -k 指定枉疼。
running
正在運行的作業(yè)名皮假,如果作業(yè)控制被激活的話。
service
服務名骂维。也可以用 -s 指定惹资。
setopt
內建命令 set 的 -o 選項的有效參數(shù)。
shopt
內建命令 shopt 接受的 shell 選項名航闺。
signal
信號名褪测。
stopped
停止的作業(yè)名,如果作業(yè)控制被激活的話潦刃。
user
用戶名侮措。也可以用 -u 指定。
variable
shell 變量的名稱乖杠。也可以用 -v 指定分扎。
-G globpat
文件名擴展模式 globpat 被擴展,產(chǎn)生可能的補全胧洒。
-W wordlist
wordlist 被使用 IFS 特殊變量中的字符作為定界符來拆分畏吓,每個結果的詞被擴展∥缆可能的補全是結果列表 中匹配要補全的詞的那一些菲饼。
-C command
command 將在一個子 shell 環(huán)境中執(zhí)行,它的結果用作可能的補全汛兜。
-F function
shell 函數(shù) function 將在當前 shell 環(huán)境中執(zhí)行巴粪。當它結束時,可能 的補全可以從數(shù)組元素 COMPREPLY 中得到粥谬。
-X filterpat
filterpat 是一個模式肛根,用于文件名擴展。所有前面的選項和參數(shù)產(chǎn)生 的可能的補全都要經(jīng)過這一步處理漏策,每一個匹配 filterpat 的補全都 被從列表中刪除派哲。為 filterpat 加上前導 ! 使模式意義相反; 這種情況下掺喻,所有不匹配 filterpat 的模式被刪除芭届。
-P prefix
在所有其他選項都處理過之后储矩,prefix 被加到每個可能的補全前面。
-S suffix
在所有其他選項都處理過之后褂乍,suffix 被加到每個可能的補全后面持隧。
返回值為真,除非給出了非法的選項逃片,給出除 -p 和 -r 之外 的某個選項時沒有給出 name 參數(shù)屡拨,試圖刪除一條 name 的補全 規(guī)則但是規(guī)則不存在,或者添加補全規(guī)則時出錯褥实。

continue [n]
復位到外層 for, while, until, 或 select 循環(huán)的下一次開始呀狼。如果指定了 n, 復位到向外第 n 層循環(huán)的開始损离。 n 必須 ≥ 1哥艇。如果 n 比外部循環(huán)的層數(shù)要多,將復位到最外層的循環(huán) (top-level'' loop僻澎,頂層循環(huán))貌踏。 返回值是 0,除非執(zhí)行 continue 時怎棱,shell 不是在循環(huán)之中哩俭。 declare [-afFirtx] [-p] [name[=value]] typeset [-afFirtx] [-p] [name[=value]] 聲明變量且/或設置它們的屬性绷跑。如果沒有給出 name 則顯示變量的值拳恋。 選項 -p 將顯示每個名稱 name 的屬性和值。當使用 -p 時砸捏,其他選項被忽略谬运。選項 -F 禁止顯示函數(shù)定義;只有函數(shù)名和屬性會被顯示垦藏。 -F 選項暗含 -f. 下列選項可用來限制只輸出具有指定屬性的變量梆暖,或者為變量設置屬性: -a 每個 name 都是數(shù)組變量 (參見上面的 Arrays 段落)。 -f 只使用函數(shù)名掂骏。 -i 變量被當作一個整數(shù)轰驳;當變量被賦值時將進行算術運算 (參見 算術求值 (ARITHMETIC EVALUATION) 章節(jié))寻行。 -r 使得 name 只讀甥郑。這些名稱不能再被后續(xù)的賦值語句賦值或取消定義蜒谤。 -t 設置每個 name 的 trace(跟蹤) 屬性主之。被跟蹤的函數(shù)繼承了 調用者 shell 的 DEBUG 陷阱析校。trace 屬性對變量沒有特殊意義疙咸。 -x 標記 name 為可以通過環(huán)境導出給后續(xù)命令彼念。 使用 `+' 代替 `-' 將關閉屬性疏叨,特殊情況是 +a 不能用于銷毀一個 數(shù)組變量掩驱。當用于函數(shù)中時芒划,它使得每個 name 成為局部的冬竟,就像 使用了 local 命令。返回值是 0民逼,除非遇到了非法的選項泵殴,試圖使用-f foo=bar'' 定義函數(shù),試圖向只讀變量賦值拼苍,試圖向數(shù)組變量賦值但沒有使用復合的賦值 語法 (參見上面的 Arrays 段落)袋狞,name 之一不是有效的 shell 變量名,試圖將數(shù)組變量的數(shù)組 狀態(tài)關閉映屋,或者是試圖使用 -f 顯示一個不存在的函數(shù)苟鸯。

dirs [-clpv] [+n] [-n]
沒有選項時顯示當前保存的目錄。默認輸出為一行棚点,目錄名用空格分開早处。 可以使用 pushd 命令將目錄添加到列表, popd 命令將列表中的條目刪除瘫析。
+n
顯示 dirs 在不帶選項執(zhí)行時顯示的列表的第 n 個條目砌梆,從 0 開始自左算起。
-n
顯示 dirs 在不帶選項執(zhí)行時顯示的列表的第 n 個條目贬循,從 0 開始自右算起咸包。
-c
刪除所有條目,清空目錄棧杖虾。
-l
產(chǎn)生長列表烂瘫;默認列表格式使用波浪線來表示個人目錄。
-p
輸出目錄棧奇适,一行一個坟比。
-v
輸出目錄棧,一行一個嚷往,每個條目前面加上它在棧中的位置索引葛账。
返回值是 0,除非給出了非法的參數(shù)皮仁,或者 n 索引超出了目錄棧的范圍籍琳。

disown [-ar] [-h] [jobspec ...]
沒有選項時,每個 jobspec 被從正在運行的作業(yè)表中刪除贷祈。如果給出了 - 選項趋急,每個 jobspec 并不從表中刪除,而是被標記付燥,使得在 shell 接到 SIGHUP 信號時宣谈,不會向作業(yè)發(fā)出 SIGHUP 信號。如果沒有給出 jobspec键科, 也沒有給出 -a 或者 -r 選項闻丑,將使用當前作業(yè) (current job)漩怎。如果沒有給出 jobspec, 選項 -a 意味著刪除或標記所有作業(yè)嗦嗡;選項 -r 不帶 jobspec 參數(shù)時限制操作只對正在運行的作業(yè)進行勋锤。返回值是 0,除非 jobspec 不指定有效的作業(yè)侥祭。
echo [-neE] [arg ...]
輸出 arg叁执,以空格分開,最后加一個新行符矮冬。返回值總是 0谈宛。 如果指定了 -n,將不在尾部添加新行符胎署。如果給出了 -e 選項吆录, 將允許解釋下列反斜杠轉義的字符。 -E 選項禁止這些轉義字符的解釋琼牧,即使在默認解釋它們的系統(tǒng)中也是如此恢筝。 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 (零到三個八進制數(shù)字)。
\nnn
一個八比特字符趾撵,它的值是八進制值 nnn (一到三個八進制數(shù)字)侄柔。
\xHH
一個八比特字符,它的值是十六進制值 HH (一到兩個十六進制數(shù)字)鼓寺。
enable [-adnps] [-f filename] [name ...]
允許或禁止 shell 內建命令勋拟。禁止一個內建命令使得磁盤上的與內建命令同名 的文件得以運行勋磕,不必使用它的全路徑妈候,即使 shell 一般在搜索磁盤上的命令之前 搜索內建命令。如果使用了 -n 選項挂滓,每個 name 都被禁止苦银;否則, name 被允許赶站。例如幔虏,要使用 PATH 中搜索到的 test 命令而不是 shell 內建的那一個,可以運行 enable -n test''. 選項 -f 意味著從共享庫 filename 中加載新的內建命令 name贝椿, 如果系統(tǒng)支持動態(tài)加載的話想括。選項 -d 將刪除曾經(jīng)用 -f 加載的內建命令。如果沒有給出 name 參數(shù)烙博,或者給出了 -p 選項瑟蜈,將顯示 shell 內建命令的列表烟逊。如果沒有其他選項參數(shù), 這個列表只包含所有被允許的 shell 內建命令铺根;如果給出了 -n宪躯,將只顯示被禁止的內建命令;如果給出了 -a位迂,顯示的列表中包含所有內建命令访雪,還有命令是否被允許的指示; 如果給出了 -s掂林,輸出被限制為 POSIX special 內建命令臣缀。 返回值是 0,除非 name 不是 shell 內建命令泻帮,或者從共享庫中加載新的內建命令時出錯肝陪。 eval [arg ...] arg 被讀取并連結為單一的命令。這個命令然后被 shell 讀取并執(zhí)行刑顺, 它的退出狀態(tài)被作為 eval 的值返回氯窍。如果沒有 args, 或僅僅包含空參數(shù)蹲堂, eval 返回 0狼讨。 exec [-cl] [-a name] [command [arguments]] 如果指定了 command, 它將替換 shell柒竞。不會產(chǎn)生新的進程政供。 arguments 成為 command 的參數(shù)。如果給出了 -l 選項朽基,shell 將在傳遞給 command 的第 0 個參數(shù)前面加上一個連字符 (dash,`-')布隔。這樣做和 login(1) 相同。選項 -c 使得命令 command 在一個空環(huán)境中執(zhí)行稼虎。如果給出了 -a衅檀, shell 會將 name 作為第 0 個參數(shù)傳遞給要執(zhí)行的命令。如果由于某種原因 as the zeroth argument to the executed command. If command 不能被執(zhí)行霎俩,非交互的 shell 將退出哀军,除非 shell 選項 execfail 被設置為允許,這種情況下它返回失敗打却。如果命令不能執(zhí)行杉适,交互的 shell 返回失敗。 如果沒有指定 command 任何重定向對當前 shell 發(fā)生作用柳击,返回值是 0猿推。如果發(fā)生重定向錯誤,返回狀態(tài)是 1捌肴。 exit [n] 使得 shell 以狀態(tài)值 n 退出蹬叭。如果忽略了 n毯侦, 退出狀態(tài)是最后執(zhí)行的命令的退出狀態(tài)。在 shell 終止前具垫,對 EXIT 的陷阱將被執(zhí)行侈离。 export [-fn] [name[=word]] ... export -p 給出的名稱 names 被標記為自動地導出到后續(xù)執(zhí)行的命令的環(huán)境中。如果給出了 -f 選項筝蚕,名稱 names 指的是函數(shù)卦碾。如果沒有給出 names, 或者如果給出了 -p 選項起宽,將打印在這個 shell 中被導出的所有名字的列表洲胖。選項 -n 使得以此為名的變量的導出屬性被刪除。 export 返回 0坯沪,除非遇到了非法的選項绿映,name 之一不是有效的 shell 變量名, 或者給出了 -f 選項腐晾,而 name 不是一個函數(shù)叉弦。 fc [-e ename] [-nlr] [first] [last] fc -s [pat=rep] [cmd] 命令修復。第一種形式中藻糖,歷史列表中從 first 到 last 范圍內的命令都被選取淹冰。 First 和 last 可以指定為字符串 (可以定位最后一個以此字符串開始的命令) 或者數(shù)字 (歷史列表中 的索引,負數(shù)被當作相對當前命令號的偏移)巨柒。如果沒有指定 last樱拴, 它在列舉時被設為當前命令 (因此fc -l -10'' 將輸出最后 10 條命令),其他情況下被設為 first洋满。 如果沒有指定 first晶乔, 它在編輯時被設為前一個命令,列舉是設為 -16牺勾。
選項 -n 使得列舉時不顯示命令號碼正罢。選項 -r 將命令順序進行掉換。如果給出了 -l 選項禽最,命令將列舉在標準輸出上腺怯。否則,將啟動 ename 給出的編輯器川无,編輯包含這些命令的文件。如果沒有給出 ename虑乖, 將使用變量 FCEDIT 的值懦趋,如果 FCEDIT 沒有定義就使用 EDITOR 的值。如果仍然沒有定義疹味,將使用 vi仅叫。 編輯結束后帜篇,被編輯的命令將回顯并執(zhí)行。

第二種形式中诫咱,command 在每個 pat 的實例被 rep 替換后 都被重新執(zhí)行笙隙。使用這種特性時可以起一個有用的別名: r=fc -s'', 這樣輸入r cc'' 將運行最后的以 cc'' 開頭的命令,輸入r'' 將重新執(zhí)行上一個命令坎缭。

如果使用第一種形式竟痰,返回值是 0,除非遇到了非法的選項掏呼,或 first 或 last 指定的歷史行數(shù)超出了范圍坏快。如果給出了 -e 選項,返回值是最后執(zhí)行的命令的返回值憎夷,或著是失敗莽鸿,如果臨時文件中的命令 執(zhí)行出錯。如果使用第二種形式拾给,返回狀態(tài)是重新執(zhí)行的命令祥得,除非 cmd 沒有指定一個有效的歷史行,這種情況下 fc 返回失敗蒋得。

fg [jobspec]
將 jobspec 恢復至前臺啃沪,使它成為當前作業(yè)。如果 jobspec 不存在窄锅,將使用 shell 意義上的當前作業(yè) current job创千。返回值是 被放到前臺的命令的狀態(tài),或者是失敗入偷,如果在禁用作業(yè)控制時運行追驴,或者 在啟用作業(yè)控制時運行,但 jobspec 沒有指定有效的作業(yè)疏之,或 jobspec 指定了沒有使用作業(yè)控制的作業(yè)殿雪。
getopts optstring name [args]
getopts 由 shell 程序用來處理位置參數(shù)。 optstring 包含要識別的選項字符锋爪;如果某個字符跟隨著冒號丙曙,那么這個選項需要一個參數(shù), 需要用空白和它隔離開其骄。冒號和問號字符不能用作選項字符亏镰。每次它執(zhí)行時, getopts 將下一個選項放在 shell 變量 name 中拯爽,如果 name 不存在就初始化它索抓;下一個要處理的參數(shù)的索引放在變量 OPTIND 中。每次 shell 或 shell 腳本被執(zhí)行的時候 OPTIND 被初始化為 1。當某個選項需要參數(shù)時逼肯, getopts 將那個參數(shù)放到變量 OPTARG 中耸黑。shell 不會自動重置 OPTIND; 在相同的 shell 中篮幢,如果要使用新的參數(shù)集合而需要多次調用 getopts 時大刊,必須手動重置它。
當遇到選項結束的時候三椿,getopts 以大于 0 的值退出缺菌。 OPTIND 被設置為第一個非選項的參數(shù)的索引,name 被設置為 ?赋续。

getopts 通常解釋位置參數(shù)男翰,但是如果 args 中給出了更多參數(shù), getopts 將解釋它們纽乱。

getopts 能以兩種方式報告錯誤蛾绎。如果 optstring 的第一個字符是冒號,將使用 silent 安靜的錯誤報告鸦列。通常的操作中租冠,遇到非法選項或缺少選項的參數(shù)時將打印出 診斷信息。如果變量 OPTERR 被設置為 0薯嗤,不會顯示錯誤消息顽爹,即使 optstring 的第一個字符不是冒號。

如果發(fā)現(xiàn)了一個非法的選項骆姐, getopts 向 name 中置入 ?镜粤,并且如果不是安靜模式的話,打印錯誤消息并取消 OPTARG 的定義玻褪。如果 getopts 是安靜模式肉渴,找到的選項字符將置入 OPTARG, 不會打印診斷消息带射。

如果沒有找到需要的參數(shù)同规,并且 getopts 不是安靜模式,將向 name 置入一個問號 (?)窟社,取消 OPTARG 的定義衙解,打印出診斷消息绿饵。如果 getopts 是安靜模式检眯,那么將向 name 置入一個冒號 (:) 并且 OPTARG 將設置為找到的選項字符俯逾。

getopts 返回真,如果找到了指定的/未被指定的選項钠四。它返回假盗扒,如果遇到了選項結束 或者發(fā)生了錯誤跪楞。

hash [-lr] [-p filename] [-dt] [name]
對于每個 name, 通過搜索 $PATH 中的目錄缀去,找到命令的全路徑名并記錄它侣灶。如果給出了 -p 選項,不會進行路徑搜索缕碎,直接將 filename 作為命令的全路徑名褥影。選項 -r 使得 shell 忘記所有已記錄的位置。選項 -d 使得 shell 忘記已記錄的 name 的位置咏雌。如果給出了 -t 選項凡怎,每個 name 對應的全路徑名被打印出來。如果給出多個 name 作為 -t 的參數(shù)赊抖,name 將在已記錄的全路徑名 之前被打印出來统倒。選項 -l 使得輸出以一種可以重用為輸入的格式顯示。如果沒有給出參數(shù)氛雪, 或者只給出了 -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 ...]
不帶選項的話零远,顯示帶行號的命令歷史列表苗分。列出的行中含有 * 的已經(jīng)被修改過。參數(shù) n 使得只顯示最后 n 行遍烦。如果給出了 filename俭嘁,它被用做歷史文件名;沒有的話服猪,將使用 HISTFILE 的值作為歷史文件名供填。選項如果給出,則具有下列意義:
-c
清空歷史列表罢猪,刪除所有條目近她。
-d offset
刪除 offset 位置的歷史條目。
-a
將 ``新'' 的歷史條目 (自當前 bash 會話開始輸入的歷史命令) 追加到歷史文件中膳帕。
-n
將尚未從歷史文件中讀取的歷史條目讀入當前歷史列表粘捎。這些行是當前 bash 會話開始之后薇缅,才追加到歷史文件中的行。
-r
讀取歷史文件的內容攒磨,使用它們作為當前歷史泳桦。
-w
將當前歷史列表寫入歷史文件,覆蓋歷史文件的原有內容娩缰。
-p
對后續(xù)的 args 進行歷史替換灸撰,在標準輸出上顯示結果。 不會將結果存入歷史列表拼坎。每個 args 都必須被引用浮毯,來禁止 普通的命令擴展。
-s
將 args 保存到歷史列表中泰鸡,作為單獨的條目债蓝。歷史列表中的最后一個命令在添加 args 之前被刪除。
返回 0盛龄,除非遇到了非法的選項饰迹,讀/寫歷史文件發(fā)生錯誤,在 -d 的 參數(shù)中給出了無效的 offset讯嫂,或者對 -p 的后續(xù)參數(shù)進行歷史擴展失敗蹦锋。

jobs [-lnprs] [ jobspec ... ]
jobs -x command [ args ... ]
第一種形式列出正在運行的作業(yè)。選項具有下列意義:
-l
普通信息之外欧芽,列出進程ID莉掂。
-p
只列出作業(yè)的進程組 leader 的進程ID。
-n
只顯示從上次用戶得知它們的狀態(tài)之后千扔,狀態(tài)發(fā)生改變的作業(yè)的信息憎妙。
-r
限制只輸出正在運行的作業(yè)。
-s
限制只輸出停止的作業(yè)曲楚。
如果給出了 jobspec 輸出被限制為僅此作業(yè)的信息厘唾。 返回 0,除非遇到了非法的選項或給出了非法的 jobspec龙誊。

如果給出了 -x 選項抚垃,作業(yè) jobs 將 command 或 args 中的任何 jobspec 替換為相應的進程組ID,執(zhí)行 command趟大, 傳遞參數(shù) args 給它并返回它的退出狀態(tài)鹤树。

kill [-s sigspec | -n signum | -sigspec] [pid | jobspec] ...
kill -l [sigspec | exit_status]
向以 pid 或 jobspec 為名的進程發(fā)送名為 sigspec 或 signum 的信號。 sigspec 可以是一個信號名稱逊朽,類似 SIGKILL 或信號編號罕伯; signum 是一個信號編號。如果 sigspec 是一個信號名稱叽讳,那么可以有追他,也可以沒有 SIG 前綴坟募。如果沒有給出 sigspec, 那么假設是 SIGTERM邑狸。 參數(shù) -l 將列出所有信號的名稱懈糯。如果給出 -l 時還有任何參數(shù),將列出參數(shù)對應的信號名稱推溃,返回狀態(tài) 0昂利。 -l 的 exit_status 參數(shù)是一個數(shù)字届腐,指定了一個信號編號或被信號 終止的進程的退出狀態(tài)值铁坎。 kill 返回真,如果至少成功發(fā)送了一個信號犁苏,或者返回假硬萍,如果發(fā)生了錯誤或遇到了 非法的選項。
let arg [arg ...]
每個 arg 都是要求值的算術表達式 (參見 算術求值(ARITHMETICEVALUATION) 章節(jié))围详。如果最后一個參數(shù) arg 求值結果是 0朴乖, let 返回 1;否則返回 0助赞。
local [option] [name[=value] ...]
對每個參數(shù)將創(chuàng)建一個名為 name 的局部變量并賦予值 value买羞。 option 可以是任何 declare 接受的值。當 local 用于函數(shù)內部時雹食,它使得變量 name 作用域局限于函數(shù)和它的子進程畜普。沒有操作數(shù)時, local 將局部變量的列表寫到標準輸出群叶。不在函數(shù)內部使用 local 會導致出錯吃挑。返回 0,除非在函數(shù)之外使用了 local街立, 給出了非法的 name舶衬, 或者 name 是一個只讀的變量。
logout
退出登錄 shell赎离。
popd [-n] [+n] [-n]
從目錄棧中刪除條目逛犹。沒有參數(shù)的話,從棧中刪除頂層目錄梁剔,執(zhí)行 cd 切換到新的頂層目錄虽画。如果給出了參數(shù),有下列的含義:
+n
刪除 dirs 給出的列表中從左數(shù)第 n 個條目 (從 0 算起)憾朴。例如: popd +0'' 刪除第一個目錄狸捕,popd +1'' 第二個。
-n
刪除 dirs 給出的列表中從右數(shù)第 n 個條目 (從 0 算起)众雷。例如: popd -0'' 刪除最后一個目錄灸拍,popd -1'' 刪除倒數(shù)第二個做祝。
-n
阻止從棧中刪除目錄之后改變目錄,這時只對棧進行操作鸡岗。
如果命令 popd 成功混槐,還要執(zhí)行一個 dirs, 返回 0轩性。 popd 返回假声登,如果遇到了非法的選項,目錄棧為空揣苏,指定了目錄棧中不存在的條目悯嗓, 或者改變目錄失敗。

printf format [arguments]
在 format 控制下將格式化的 arguments 寫到標準輸出卸察。 format 是一個字符串脯厨,包含三種類型的對象:普通字符,被簡單地 復制到標準輸出坑质,轉義字符合武,被轉換并復制到標準輸出,格式說明涡扼,每一個 都使得相鄰的下一個 argument 被打印出來稼跳。 在標準的 printf(1) 格式之外,%b 使得 printf 展開相應 arguments 中的反斜杠轉義序列吃沪,%q 使得 printf 將 相應的 argument 以一種可以重用為 shell 輸入的格式輸出汤善。
format 在需要時被重用,以處理所有的 arguments巷波。 如果 format 需要比所提供的更多的 arguments萎津, 多出的格式說明視為已經(jīng)提供了相應的 0 值或空字符串。 成功的話返回值是 0抹镊,失敗則是非 0 值锉屈。

pushd [-n] [dir]
pushd [-n] [+n] [-n]
將目錄推入目錄棧,或者輪換棧中的內容垮耳,使棧的頂部成為當前工作目錄颈渊。 沒有參數(shù)時,交換頂部兩個目錄终佛,返回 0俊嗽,除非目錄棧為空。如果給出了參數(shù)铃彰, 它們有如下含義:
+n
輪換棧中內容绍豁,使得 dirs 給出的列表中從左數(shù)第 n 個目錄 (從 0 數(shù)起) 成為目錄棧的頂部。
-n
輪換棧中內容牙捉,使得 dirs 給出的列表中從右數(shù)第 n 個目錄 (從 0 數(shù)起) 成為目錄棧的頂部竹揍。
-n
阻止向棧中添加目錄之后改變目錄敬飒,這時只對棧進行操作。
dir
添加 dir 到棧頂芬位,使得它成為新的當前工作目錄无拗。
如果命令 pushd 成功,還要執(zhí)行一個 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 選項的參數(shù)中給出的文件描述符 fd 中 讀取蛙奖,第一個詞被賦予第一個 name, 第二個詞被賦予第二個 name, 以此類推,多余的詞和其間的分隔符被賦予最后一個 name. 如果從輸入流讀入的詞數(shù)比名稱數(shù)少杆兵,剩余的名稱被賦予空值雁仲。 IFS 中的字符被用來將行拆分成詞。 反斜杠字符 () 被用于刪除讀取的下一字符的特殊含義琐脏,以及續(xù)行攒砖。 如果給出了選項,將包含下列含義:
-a aname
詞被賦以數(shù)組變量 aname 的連續(xù)的下標日裙,從 0 開始吹艇。在賦新值之前, aname 被取消定義昂拂。其他 name 參數(shù)被忽略受神。
-d delim
delim 的第一個字符被用于結束輸入行,而不是新行符格侯。
-e
如果標準輸入來自終端鼻听,將使用 readline (參見上面的 READLINE 章節(jié)) 來獲得輸入行樟结。
-n nchars
read 讀入 nchars 個字符后返回,而不是等待一整行輸入精算。
-p prompt
讀取任何輸入之前瓢宦,在標準錯誤顯示提示 prompt,末尾沒有新行符灰羽。 提示只有在輸入來自終端時才會顯示驮履。
-r
反斜杠不作為轉義字符。反斜杠被認為行的一部分廉嚼。特殊地玫镐,一對反斜杠-新行符不作為續(xù)行。
-s
安靜模式怠噪。如果輸入來自終端恐似,字符將不會回顯。
-t timeout
使得 read 超時并返回失敗傍念,如果在 timeout 秒內沒有讀入完整的一行輸入矫夷。 如果 read 不是從終端或管道讀取輸入,那么這個選項無效憋槐。
-u fdFP
從文件描述符 fd 中讀取輸入双藕。
如果沒有給出 names, 讀取的一行將賦予變量 REPLY阳仔。 返回值是 0忧陪,除非遇到了 EOF,readP 超時近范,或給出了非法的文件描述符作為 -u 的參數(shù)嘶摊。

readonly [-apf] [name ...]
給出的 name 將被標記為只讀的; names 的值不能被后來的賦值語句改變评矩。如果給出了 -f 選項叶堆,names 對應的函數(shù)也被標記。選項 -a 限制變量只能是數(shù)組類型稚照。如果沒有給出 name 參數(shù)蹂空,或者如果給出了 -p 選項,將打印所有只讀的名稱果录。選項 -p 使得輸出以一種可以被重新用作輸入的格式顯示上枕。 返回值是 0,除非遇到了非法的選項弱恒, names 之一不是有效的 shell 變量名辨萍,或選項 -f 中給出的 name 不是一個函數(shù)。
return [n]
使得一個函數(shù)以指定值 n 退出。如果忽略了 n锈玉, 返回狀態(tài)是函數(shù)體中執(zhí)行的最后一個命令的退出狀態(tài)爪飘。如果在函數(shù)外使用,但是是在一個以 . (source) 命令執(zhí)行的腳本內拉背,它使得 shell 中止執(zhí)行腳本蟹腾,返回 n 或腳本中執(zhí)行的最后一個命令的退出狀態(tài)网棍。如果在函數(shù)外使用秋冰,并且不是在以 . 執(zhí)行的腳本內偿凭,返回狀態(tài)是假。
set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
不帶選項時两疚,shell 變量的名稱和值將以一種可以重用為輸入的格式顯示床估。 輸出根據(jù)當前語言環(huán)境進行排序。指定了選項的時候诱渤,它們設置或取消了 shell 的屬性丐巫。 處理完選項之后剩余的任何參數(shù)都被作為位置參數(shù)的值被賦值,分別賦予 $1, $2, ... $n. 如果給出了選項勺美,那么具有以下含義:
-a
自動將被修改或創(chuàng)建的變量和函數(shù)標志為導出至后續(xù)命令的環(huán)境中递胧。
-b
后臺作業(yè)結束時立即報告狀態(tài),而不是在下次顯示主提示符前報告励烦。只有在啟用作業(yè)控制時才有效谓着。
-e
立即退出,如果 simple command (簡單命令坛掠,參見上面的 SHELL GRAMMAR 語法) 以非零值退出。shell 不會退出治筒,如果失敗的命令是 until 或 while 循環(huán)的一部分屉栓, if 語句的一部分, && 或 || 序列的一部分耸袜,或者命令的返回值是由 ! 翻轉得到友多。針對 ERR 的陷阱,如果設置的話堤框,將在 shell 退出前執(zhí)行域滥。
-f
禁止路徑擴展。
-h
在查找并執(zhí)行命令時蜈抓,記住它們的位置启绰。這是默認啟用的。
-k
所有以賦值語句形式出現(xiàn)的參數(shù)都被加入到命令執(zhí)行的環(huán)境中沟使,不僅是命令名前面那些委可。
-m
監(jiān)視模式。作業(yè)控制被啟用腊嗡。在支持這個選項的系統(tǒng)中着倾,它在交互 shell 中是默認啟用的 (參見上面的 JOB CONTROL 作業(yè)控制)拾酝。 后臺進程在單獨的進程組中運行,結束時將打印出包含它們退出狀態(tài)的一行信息卡者。
-n
讀取命令蒿囤,但不執(zhí)行。這可以用在檢查 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
它的效果是好像已經(jīng)執(zhí)行了 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 函數(shù)不會從環(huán)境中繼承包归,環(huán)境中如果有變量 SHELLOPTS, 也將被忽略铅歼。如果 shell 啟動時的有效用戶(組) ID 與真實用戶(組) ID 不同公壤,并且沒有給出 -p 選項, 將執(zhí)行這些操作椎椰,有效用戶 ID 將設置為真實用戶 ID厦幅。如果啟動是給出了 -p 選項,有效用戶 ID 不會 被重置慨飘。將這個選項關閉使得有效用戶和組 ID 被設置為真實用戶和組 ID确憨。
-t
讀取并執(zhí)行一個命令之后退出。
-u
在進行參數(shù)擴展時瓤的,將未定義的變量作為錯誤休弃。如果試圖擴展未定義的變量,shell 將輸出一條錯誤消息; 如果是非交互的 shell圈膏,shell 將以非零值退出塔猾。
-v
在讀取輸入的同時打印出來。
-x
擴展每個簡單命令之后稽坤,顯示 PS4 的值丈甸,接著顯示命令和它擴展后的參數(shù)。
-B
shell 執(zhí)行花括號擴展 (參見上面的 Brace Expansion)尿褪。 這是默認允許的老虫。
-C
如果設置的話, bash 使用重定向操作符 >, >&, 和 <> 時茫多,不會覆蓋已存在的文件『龉簦可以使用重定向操作符 >| 代替 > 來創(chuàng)建輸出文件天揖,從而繞過這個限制。
-H
允許 Enable ! 樣式的歷史替換跪帝。在交互 shell 中這個選項是默認啟用的今膊。
-P
如果設置的話,shell 在執(zhí)行類似 cd 的伞剑,改變當前工作目錄的命令時斑唬,不會跟隨符號連接。它將使用物理的目錄結構來代替。默認情況下恕刘, bash 在執(zhí)行改變當前目錄的命令時跟隨路徑的邏輯鏈缤谎。
--
如果這個選項沒有參數(shù),將取消位置參數(shù)的定義褐着。否則坷澡,位置參數(shù)將設置為 arg,即使它們以 - 開始含蓉。

通知信號的結束频敛,使得所有剩余的 arg 被賦予位置參數(shù)。 -x 和 -v 選項被關閉馅扣。如果沒有 arg斟赚,位置參數(shù)將不會改變。
這個選項默認是關閉的差油,除非另外說明拗军。使用 + 而不是 - 使得這些選項被關閉。選項都可以作為參數(shù)厌殉, 在 shell 啟動時指定食绿。當前的選項集合可以從 $- 找到。返回值總是真公罕,除非遇到了非法的選項器紧。

shift [n]
從 n+1 ... 開始的選項被重命名為 $1 .... 從 $# 向下直到 $#-n+1 的選項被取消定義。 n 必須是非負整數(shù)楼眷,小于或等于 $#铲汪。如果 n 是 0,不會改變參數(shù)罐柳。如果沒有給出 n掌腰, 就假定它是 1。如果 n 比 $# 大张吉,位置參數(shù)不會改變齿梁。返回值大于 0,如果 n 比 $# 大或小于 0肮蛹;否則返回 0勺择。
shopt [-pqsu] [-o] [optname ...]
對于控制可選的 shell 行為的變量,改變它們的值伦忠。沒有選項或者有 -p 選項時省核,將顯示所有可設置的選項列表,以及它們是否已經(jīng)設置的指示昆码。 -p 使得輸出以一種可以被重用為輸入的形式顯示气忠。 其他選項有如下含義:
-s
允許(設置) 每個 optname邻储。
-u
禁止(取消) 每個 optname。
-q
禁止通常的輸出 (安靜模式)旧噪;返回狀態(tài)指示了 optname 是否被設置吨娜。 如果對 -q 給出了多個 optname 參數(shù),如果所有 optname 都被允許舌菜,返回值就是 0萌壳; 否則返回非零值。
-o
限制 optname 的值為內建命令 set 的 -o 選項定義的值日月。
如果使用 -s 或 -u 時沒有給出 optname 參數(shù)袱瓮,顯示將分別限于被設置或被取消的選項。 除非另外說明爱咬,shopt 選項默認被禁止(取消)尺借。

返回值在列出選項時是 0,如果所有 optname 都被允許的話精拟,否則是非零值燎斩。 當設置或取消選項時,返回值是 0蜂绎,除非 optname 是非法的 shell 選項栅表。

shopt 選項的列表是:

cdable_vars
如果設置的話,內建命令 cd 的參數(shù)如果不是目錄师枣,就假定是一個變量怪瓶,它的值是要切換到的目錄名。
cdspell
如果設置的話践美, cd 命令中目錄的細微拼寫錯誤能夠得以糾正洗贰。檢查的錯誤包括字符錯位,缺字符陨倡, 重復輸入同一字符敛滋。如果找到了正確的值,將打印正確的文件名兴革,命令將繼續(xù)绎晃。 這個選項只能在交互 shell 中使用。
checkhash
如果設置的話杂曲,bash 在執(zhí)行命令前檢測散列表中的命令是否存在箕昭。 如果一個被散列的命令不再存在,將進行正常的路徑搜索解阅。
checkwinsize
如果設置的話,bash 在每條命令執(zhí)行后檢測窗口大小泌霍,如果需要的話就更新 LINES 和 COLUMNS 的值货抄。
cmdhist
如果設置的話述召, bash 試著將一個多行命令的所有行放到同一個歷史條目中。這樣使得 多行命令可以容易地重新修改蟹地。
dotglob
如果設置的話积暖, bash 會把以 `.' 開始的文件名包含在路徑名擴展的結果中。
execfail
如果設置的話怪与,非交互的 shell 如果不能執(zhí)行作為參數(shù)提供給內建命令 exec 的文件時將不會退出夺刑。交互的 shell 在 exec 失敗時不會退出。
expand_aliases
如果設置的話分别,別名被擴展遍愿,就像上面 ALIASES 中講到的一樣。這個選項在交互 shell 中是默認啟用的耘斩。
extglob
如果設置的話沼填,將允許上面 Pathname Expansion 中提到的擴展模式匹配特性。
histappend
如果設置的話括授,在 shell 退出時坞笙,歷史列表將追加到以 HISTFILE 的值為名的文件之后,而不是覆蓋文件荚虚。
histreedit
如果設置的話薛夜,并且正在使用 readline, 用戶可以重新修改失敗的歷史替換版述。
histverify
如果設置的話梯澜,并且正在使用 readline, 歷史替換的結果不會立即傳給 shell 解釋器院水。結果行被加載到 readline 編輯緩沖區(qū)腊徙,允許進行進一步的修改。
hostcomplete
如果設置的話檬某,并且正在使用 readline撬腾, bash 將試著對正在進行補全的包含 的詞進行主機名補全 (參見上面的 READLINE 中的 Completing 段落)。這是默認允許的恢恼。
huponexit
如果設置的話民傻,在交互的登錄 shell 退出時 bash 將向所有作業(yè)發(fā)出 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块仆, 試圖在空行上執(zhí)行補全時, bash 不會搜索 PATH 來查找可能的補全王暗。
nocaseglob
如果設置的話悔据, bash 進行路徑擴展時使用大小寫不敏感方式匹配文件名(參見上面的 Pathname Expansion 路徑擴展)。
nullglob
如果設置的話瘫筐, bash 將允許不匹配任何文件的模式擴展為空字符串而不是它們自身(參見上面的 Pathname Expansion 路徑擴展)蜜暑。
progcomp
如果設置的話,將啟用可編程補全功能 (參見上面的 Programmable Completion)策肝。 這個選項是默認啟用的肛捍。
promptvars
如果設置的話,提示字符串要經(jīng)過上面 PROMPTING 中描述的擴展之众,然后還要經(jīng)過變量和參數(shù)擴展拙毫。這個選項是默認啟用的。
restricted_shell
shell 設置這個選項棺禾,如果它是以受限模式啟用的 (參見下面的 受限的shell(RESTRICTED SHELL) 章節(jié))缀蹄。這個值不能修改。在執(zhí)行啟動文件時膘婶,它不會被重置缺前,使得啟動文件可以 得知 shell 是否是受限的。
shift_verbose
如果設置的話悬襟,內建命令 shift 在偏移量超過位置參數(shù)的個數(shù)時打印一條錯誤消息衅码。
sourcepath
如果設置的話食茎,內建命令 source (.) 使用 PATH 中的值來查找包含作為參數(shù)給出的文件流妻。這個選項默認是啟用的榆俺。
xpg_echo
如果設置的話冀痕,內建命令 echo 默認擴展反斜杠轉義序列。
suspend [-f]
掛起 shell 的執(zhí)行酸纲,直到收到一個 SIGCONT 信號倡鲸。選項 -f 表示如果這是一個登錄 shell特漩,那么不要提示亿驾,直接掛起嘹黔。返回值是 0,除非 shell 是登錄 shell 并且沒有指定 -f莫瞬, 或者沒有啟用作業(yè)控制参淹。
test expr
[ expr ]
返回狀態(tài)值 0 或 1醉锄,根據(jù)條件表達式 expr 的求值而定。每個操作符和操作數(shù)都必須是一個單獨的參數(shù)浙值。表達式使用上面 條件表達式(CONDITIONALEXPRESSIONS) 中的操作構造。
表達式可以用下列操作符結合檩小,以優(yōu)先級的降序列出开呐。

! expr
值為真,如果 expr 為假规求。
( expr )
返回 expr 的值筐付。括號可以用來超越操作符的一般優(yōu)先級。
expr1 -a expr2
值為真阻肿,如果 expr1 和 expr2 都為真瓦戚。
expr1 -o expr2
值為真,如果 expr1 或 expr2 為真丛塌。
test 和 [ 使用基于參數(shù)個數(shù)的一系列規(guī)則较解,對條件表達式進行求值。

0 arguments
表達式為假赴邻。
1 argument
表達式為真印衔,當且僅當參數(shù)非空。
2 arguments
如果第一個參數(shù)是 !姥敛,表達式為真奸焙,當且僅當?shù)诙€參數(shù)為空。 如果第一個參數(shù)是上面 條件表達式(CONDITIONALEXPRESSIONS) 中列出的單目條件運算符之一彤敛,表達式為真与帆,當且僅當單目測試為真。 如果第一個參數(shù)不是合法的單目條件運算符墨榄,表達式為假玄糟。
3 arguments
如果第二個參數(shù)是上面 條件表達式(CONDITIONALEXPRESSIONS) 中列出的二進制條件操作符之一,表達式的結果是使用第一和第三個參數(shù)作為操作數(shù)的二進制測試的結果渠概。 如果第一個參數(shù)是 !茶凳,表達式值是使用第二和第三個參數(shù)進行雙參數(shù)測試的結果取反。 如果第一個參數(shù)是 (播揪,第三個參數(shù)是 )贮喧,結果是對第二個參數(shù)進行單參數(shù)測試的結果。 否則猪狈,表達式為假箱沦。這種情況下 -a 和 -o 操作符被認為二進制操作符。
4 arguments
如果第一個參數(shù)是 !雇庙,結果是由剩余參數(shù)組成的三參數(shù)表達式結果取反谓形。 否則灶伊,表達式被根據(jù)上面列出的優(yōu)先級規(guī)則解釋并執(zhí)行。
5 或更多 arguments
表達式被根據(jù)上面列出的優(yōu)先級規(guī)則解釋并執(zhí)行寒跳。
times
對 shell 以及 shell 運行的進程聘萨,打印累計的用戶和系統(tǒng)時間。 返回狀態(tài)是 0童太。
trap [-lp] [arg] [sigspec ...]
當 shell 收到信號 sigspec 時米辐,命令 arg 將被讀取并執(zhí)行。如果沒有給出 arg 或者給出的是 -, 所有指定的信號被設置為它們的初始值 (進入 shell 時它們的值)书释。如果 arg 是空字符串翘贮, sigspec 指定的信號被 shell 和它啟動的命令忽略。如果 arg 不存在爆惧,并且給出了 -p 那么與每個 sigspec 相關聯(lián)的陷阱命令將被顯示出來狸页。如果沒有給出任何參數(shù),或只給出了 -p扯再, trap 將打印出與每個信號編號相關的命令列表芍耘。每個 sigspec 可以是 <signal.h> 定義的信號名,或是一個信號編號叔收。 如果 sigspec 是 EXIT (0)齿穗,命令 arg 將在 shell 退出時執(zhí)行。如果 sigspec 是 DEBUG, 命令 arg 將在每個簡單命令 (simple command饺律,參見上面的 SHELL GRAMMAR) 之后執(zhí)行窃页。如果 sigspec 是 ERR, 命令 arg 將在任何命令以非零值退出時執(zhí)行。如果失敗的命令是 until 或 while 循環(huán)的一部分复濒, if 語句的一部分脖卖, && 或 || 序列的一部分,或者命令的返回值是通過 ! 轉化而來巧颈, ERR 陷阱將不會執(zhí)行畦木。選項 -l 使得 shell 打印信號名和對應編號的列表。 shell 忽略的信號不能被捕捉或重置砸泛。在子進程中十籍,被捕捉的信號在進程創(chuàng)建時被重置為初始值。 返回值為假唇礁,如果 sigspec 非法勾栗;否則 trap 返回真。
type [-aftpP] name [name ...]
沒有選項時盏筐,指示每個 name 將如何被解釋围俘,如果用作一個命令名。如果使用了 -t 選項, type 打印一個字符串界牡,內容是如下之一: alias, keyword, function, builtin, 或 file 簿寂, 如果 name 分別是一個別名,shell 保留字宿亡,函數(shù)常遂,內建命令或磁盤文件。如果沒有找到 name挽荠, 那么不會打印任何東西烈钞,返回退出狀態(tài)假。如果使用了 -p 選項坤按, type 返回如果 name 作為命令名,將被執(zhí)行的磁盤文件名馒过;或者返回空臭脓,如果 type -t name'' 不會返回 file. 選項 -P 選項強制對每個 name 搜索 PATH, 即使type -t name'' 不會返回 file. 如果命令在散列中腹忽, -p 和 -P 將打印散列的值来累,而不是 PATH 中首先出現(xiàn)的那一個文件。如果使用了 -a 選項窘奏, type 打印所有包含可執(zhí)行的名稱 name 的場合嘹锁。結果包括別名和函數(shù),當且僅當沒有同時使用 -p 選項着裹。使用 -a 時不會查找散列中的命令表领猾。選項 -f 阻止 shell 進行查找,就像在內建命令 command 中一樣骇扇。 type 返回真摔竿,如果找到了任何參數(shù)。什么都沒找到則返回假少孝。
ulimit [-SHacdflmnpstuv [limit]]
在支持它的系統(tǒng)上继低,對 shell 和它啟動的進程,提供對可用資源的控制稍走。 選項 -H 和 -S 指定為所給資源設定的硬性和柔性限額袁翁。 硬性限額在設置后不能增加;柔性限額可以增加婿脸,直到與硬性限額相等粱胜。 如果沒有給出 -H 或 -S 選項,將同時設置硬性和柔性限額盖淡。 limit 的值可以是一個數(shù)字年柠,單位是指定資源的單元值,或者是特殊值 hard, soft, 或 unlimited 之一,意思分別是當前硬性限額冗恨,當前柔性限額和沒有限額答憔。如果忽略了 limit, 將打印出當前對資源的柔性限額值掀抹,除非給出了 -H 選項虐拓。當指定多于一個 資源時,限額名稱和單位將在值之前打印出來傲武。其他選項按照如下意義解釋:
-a
報告所有當前限額
-c
core 文件的最大值
-d
進程數(shù)據(jù)段的最大值
-f
shell 創(chuàng)建的文件的最大值
-l
內存中可以鎖定的最大值
-m
常駐內存的最大值
-n
打開的文件描述符最大個數(shù) (大多數(shù)系統(tǒng)不允許設置這個值)
-p
管道大小蓉驹,以 512 字節(jié)的塊為單位 (這個值可能不能設置)
-s
棧的最大值
-t
cpu 時間總數(shù)的最大值,以秒計
-u
用戶可以運行的最大進程數(shù)
-v
shell 可用的虛擬內存總量的最大值
如果給出了 limit揪利, 它將是指定資源的新限額 (選項 -a 只顯示它們)态兴。如果沒有給出選項,則假設有 -f疟位。 值的遞增間隔是 1024 字節(jié)瞻润,除了 -t 單位是 秒, -p 單位是 512 字節(jié)的塊個數(shù)甜刻, -n 和 -u 是不可調節(jié)的值绍撞。返回 0,除非給出了非法的選項或參數(shù)得院,或者在設置新的限額時發(fā)生了錯誤傻铣。

umask [-p] [-S] [mode]
用戶創(chuàng)建文件的掩碼被設置為 mode. 如果 mode 以數(shù)字開始,它被解釋為一個八進制數(shù)祥绞;否則被解釋為類似于 chmod(1) 接受的符號形式的模式掩碼非洲。如果忽略了 mode, 將打印當前掩碼值就谜。選項 -S 使得掩碼以符號形式打庸置铩;默認輸出是八進制數(shù)丧荐。如果給出了 -p 選項缆瓣,并且忽略了 mode, 輸出將是一種可以重用為輸入的形式虹统。返回值是 0弓坞,如果成功改變了模式,或者沒有給出 mode车荔。 其他情況返回假渡冻。
unalias [-a] [name ...]
從已定義的別名列表中刪除 name。如果給出了 -a 將刪除所有別名定義忧便。返回值是真族吻,除非給出的 name 不是已定義的別名。
unset [-fv] [name ...]
將每個 name 對應的變量或函數(shù)刪除。如果沒有給出選項超歌,或者給出了 -v 選項砍艾, name 僅包括 shell 變量。只讀的變量不能被取消定義巍举。如果給出了 -f 選項脆荷, name 僅包括 shell 函數(shù),函數(shù)的定義將被刪除懊悯。每個被取消定義的變量或函數(shù)都被從后續(xù)命令的環(huán)境中刪除蜓谋。 如果 RANDOM, SECONDS, LINENO, HISTCMD, FUNCNAME, GROUPS, 或者 DIRSTACK 中的任何一個被取消定義,它們將喪失特殊的屬性炭分,即使它們后來被重新定義桃焕。 退出狀態(tài)是真,除非 name 不存在或是只讀的捧毛。
wait [n]
等待指定的進程覆旭,返回它的終止狀態(tài)。 n 可以是進程 ID 或一個作業(yè)號岖妄;如果給出的是作業(yè)號,將等待作業(yè)的管道中所有進程寂祥。如果沒有給出 n荐虐, 將等待所有當前處于激活狀態(tài)的子進程,返回狀態(tài)是 0丸凭。如果 n 指定了不存在的進程或作業(yè)福扬,返回狀態(tài)是 127。否則惜犀,返回狀態(tài)是所等待的最后一個進程或作業(yè)的退出狀態(tài)铛碑。

受限的shell(RESTRICTED SHELL)

如果 bash 以 rbash 名稱啟動,或者啟動時使用了 -r 選項虽界,那么它成為受限的 shell汽烦。 受限的 shell 一般用來建立一個比標準的 shell 受到更多控制的環(huán)境。 它的行為與 bash 一致莉御,除了下列行為是不允許的 (disallowed) 或不會運行的 (not performed)撇吞。

?
使用 cd 來改變路徑;
?
設置或取消 SHELL, PATH, ENV, 或 BASH_ENV 變量的值礁叔;
?
指定的命令名中包含 / 牍颈;
?
指定包含 / 的文件名作為傳遞給內建命令 . 的參數(shù);
?
指定包含斜杠 (slash) 的文件名作為 -p 選項的參數(shù)琅关,傳遞給 hash 內建命令煮岁;
?
啟動時從 shell 環(huán)境中導入 (import) 函數(shù)定義;
?
啟動時解釋 shell 環(huán)境中 SHELLOPTS 的值;
?
使用 >, >|, <>, >&, &>, 和 >> 等重定向操作符重定向輸出画机;
?
使用 exec 內建命令來以另一個命令替換 shell冶伞;
?
使用 enable 內建命令的 -f 和 -d 選項來增加和刪除內建命令;
?
使用 enable 內建命令來允許和禁止 shell 內建命令色罚;
?
指定 command 內建命令的 -p 選項碰缔;
?
使用 set +r 或 set +o restricted 來關閉受限模式。
這些限制在所有啟動文件讀取之后才會生效戳护。

當一個 shell 腳本作為一個命令執(zhí)行時 (參見上面的 命令執(zhí)行(COMMAND EXECUTION) 章節(jié))金抡, rbash 關閉為執(zhí)行腳本而孵化 (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 可執(zhí)行文件
/etc/profile
系統(tǒng)范圍的初始化文件腌且,登錄 shell 會執(zhí)行它
~/.bash_profile
個人初始化文件梗肝,登錄 shell 會執(zhí)行它
~/.bashrc
個人的每個交互式 shell 啟動時執(zhí)行的文件
~/.bash_logout
個人的登錄 shell 清理文件,當一個登錄 shell 退出時會執(zhí)行它
~/.inputrc
個人的 readline 初始化文件

作者(AUTHORS)

Brian Fox, Free Software Foundation
bfox@gnu.org
Chet Ramey, Case Western Reserve University
chet@ins.CWRU.Edu

報告BUGS (BUG REPORTS)

如果你發(fā)現(xiàn)一個 bash 中的 bug铺董,你應當報告它巫击。但是首先, 你應當確定它真的是一個 bug精续,并且它在你使用的最新版本的 bash 中存在坝锰。
一旦你認定存在那樣一個 bug,使用 bashbug 命令來提交一個錯誤報告重付。 如果你有固定住址顷级,鼓勵你用郵政的方式提交一份! 建議和有關 bash “哲學” (`philosophical') 的 “錯誤報告” 可以寄給 bug-bash@gnu.org 或者貼到 Usenet 新聞組 gnu.bash.bug 之上确垫。

所有錯誤報告應當包括:

bash 的版本號
硬件信息和操作系統(tǒng)
用來編譯的編譯器
對 bug 行為的描述
可以激活這個 bug 的一個短小的腳本或者什么 “秘訣” (recipe)
bashbug 會自動在它提供的錯誤報告模板中插入前三項弓颈。

關于這份手冊頁的評論和錯誤報告請直接提交到 chet@ins.CWRU.Edu.

BUGS

它太大了,并且有點慢删掀。

bash 和傳統(tǒng)版本的 sh 之間有一些細微的差別翔冀,大部分是因為 POSIX 規(guī)約的要求。

別名機制在一些應用中會混淆披泪。

Shell 內建命令和函數(shù)不可終止/重新開始纤子。

組合的命令和使用 `a ; b ; c' 形式的命令序列在進程試圖暫停時不能很好處理。 當一個進程中止款票,shell 會立即執(zhí)行序列中的下一條命令计福。 也可以將命令的序列放在圓括號中,來強制啟動子 shell徽职,這樣就可以將它們作為一個單元中止了象颖。

在 $(...) 命令替換中的注釋不會被解釋,直到執(zhí)行替換的時候姆钉。 這將延遲報錯说订,直到命令開始執(zhí)行之后的一段時間抄瓦。

數(shù)組變量還不能導出 (export)。

[中文版維護人]

袁乙鈞 bbbush@163.com
[中文版最新更新]

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

http://cmpp.linuxforum.net

Index

NAME
概述(SYNOPSIS)
版權所有(COPYRIGHT)
描述(DESCRIPTION)
選項(OPTIONS)
參數(shù)(ARGUMENTS)
啟動(INVOCATION)
定義(DEFINITIONS)
保留字(RESERVED WORDS)
shell語法(SHELL GRAMMAR)
Simple Commands 簡單命令
Pipelines 管道
Lists 序列
Compound Commands 復合命令
注釋(COMMENTS)
引用(QUOTING)
參數(shù)(PARAMETERS)
Positional Parameters 位置參數(shù)
Special Parameters 特殊參數(shù)
Shell Variables 變量
Arrays
擴展(EXPANSION)
Brace Expansion
Tilde Expansion
Parameter Expansion
Command Substitution
Arithmetic Expansion
Process Substitution
Word Splitting
Pathname Expansion
Quote Removal
重定向(REDIRECTION)
Redirecting Input
Redirecting Output
Appending Redirected Output (添加到重定向后的輸出尾部)
Redirecting Standard Output and Standard Error
Here Documents
Here Strings
Duplicating File Descriptors (復制文件描述符)
Moving File Descriptors
Opening File Descriptors for Reading and Writing
別名(ALIASES)
函數(shù)(FUNCTIONS)
算術求值(ARITHMETIC EVALUATION)
條件表達式(CONDITIONAL EXPRESSIONS)
簡單命令擴展(SIMPLE COMMAND EXPANSION)
命令執(zhí)行(COMMAND EXECUTION)
命令執(zhí)行環(huán)境(COMMAND EXECUTION ENVIRONMENT)
環(huán)境(ENVIRONMENT)
退出狀態(tài)(EXIT STATUS)
信號(SIGNALS)
作業(yè)控制(JOB CONTROL)
提示符(PROMPTING)
readline庫(READLINE)
Readline Notation
Readline Initialization 初始化
Readline Key Bindings
Readline Variables
Readline Conditional Constructs
Searching
Readline Command Names
Commands for Moving 移動
Commands for Manipulating the History 操縱歷史行
Commands for Changing Text 改變文本
Killing and Yanking 剪切和粘貼
Numeric Arguments 數(shù)值參數(shù)
Completing 補全
Keyboard Macros 宏
Miscellaneous
Programmable Completion 可編程補全
歷史(HISTORY)
歷史擴展(HISTORY EXPANSION)
Event Designators
Word Designators
修飾符 (Modifiers)
shell 內建命令(SHELL BUILTIN COMMANDS)
受限的shell(RESTRICTED SHELL)
參見(SEE ALSO)
文件(FILES)
作者(AUTHORS)
報告BUGS (BUG REPORTS)
BUGS
[中文版維護人]
[中文版最新更新]
《中國linux論壇man手冊頁翻譯計劃》:
This document was created by man2html, using the manual pages.
Time: 12:56:50 GMT, November 06, 2008

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末陶冷,一起剝皮案震驚了整個濱河市钙姊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埂伦,老刑警劉巖煞额,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沾谜,居然都是意外死亡膊毁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門基跑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婚温,“玉大人,你說我怎么就攤上這事媳否≌っ” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵篱竭,是天一觀的道長力图。 經(jīng)常有香客問我,道長掺逼,這世上最難降的妖魔是什么搪哪? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任候醒,我火速辦了婚禮操骡,結果婚禮上展蒂,老公的妹妹穿的比我還像新娘。我一直安慰自己兽泄,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布漾月。 她就那樣靜靜地躺著病梢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梁肿。 梳的紋絲不亂的頭發(fā)上蜓陌,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音吩蔑,去河邊找鬼钮热。 笑死,一個胖子當著我的面吹牛烛芬,可吹牛的內容都是我干的隧期。 我是一名探鬼主播飒责,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仆潮!你這毒婦竟也來了宏蛉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤性置,失蹤者是張志新(化名)和其女友劉穎拾并,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹏浅,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡嗅义,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了篡石。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芥喇。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凰萨,靈堂內的尸體忽然破棺而出继控,到底是詐尸還是另有隱情,我是刑警寧澤胖眷,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布武通,位于F島的核電站,受9級特大地震影響珊搀,放射性物質發(fā)生泄漏冶忱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一境析、第九天 我趴在偏房一處隱蔽的房頂上張望囚枪。 院中可真熱鬧,春花似錦劳淆、人聲如沸链沼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽括勺。三九已至,卻和暖如春曲掰,著一層夾襖步出監(jiān)牢的瞬間疾捍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工栏妖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乱豆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓吊趾,卻偏偏與公主長得像咙鞍,于是被迫代替她去往敵國和親房官。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345