BASH(1)
BASH(1)
NAME
bash - GNU Bourne-Again SHell (GNU 命令解释程序 “Bourne 二世”)
概述(SYNOPSIS)
bash [options] [file]
版权所有(COPYRIGHT)
Bash is Copyright (C) 1989-2002 by the Free Software Foundation, Inc.
描述(DESCRIPTION)
Bash 是一个与 sh 兼容的命令解释程序,可以执行从标准输入或者文件中读取的
命令。 Bash 也整合了 Korn 和 C Shell (ksh 和 csh) 中的优秀特性。
Bash 的目标是成为遵循 IEEE POSIX Shell and Tools specification
(IEEE
Working Group 1003.2,可移植操作系统规约: shell 和工具) 的实现。
选项(OPTIONS)
除 了在 set 内建命令的文档中讲述的单字符选项 (option) 之外,bash 在启动
时还解释下列选项。
-c string 如果有 -c 选项,那么命令将从 string 中读取。如果 string 后 面
-i
-l
-r
-s
-D
[-+]O [shopt_option]
如果有 -i 选项,shell 将交互地执行 ( interactive )。
选项使得 bash 以类似登录 shell (login shell) 的方式启动 (参见
如果有 -r 选项,shell 成为受限的 ( restricted ) (参见下面的
如果有 -s 选项,或者如果选项处理完以后,没有参数剩余,那么 命
向标准输出打印一个以 $ 为前导的,以双引号引用的字符串列表。这
令将从标准输入读取。这个选项允许在启动一个交互 shell 时可以设
置位置参数。
是 在当前语言环境不是 C 或 POSIX 时,脚本中需要翻译的字符串。
这个选项隐含了 -n 选项;不会执行命令。
shopt_option 是一个 shopt 内建命令可接受的选项 (参见 下 面 的
shell
内 建 命 令(SHELL BUILTIN COMMANDS)
章节)。如果有
有参数 (argument),它们将用于给位置参数 (positional parameter
,以 $0 起始) 赋值。
受限的 shell(RESTRICTED SHELL) 章节)。
下面的 启动(INVOCATION) 章节)。
为文件名和参数对待。参数 - 与此等价。
等价于 -D,但是输出是 GNU gettext po (可移植对象) 文件格式
如 果 shell 是交互的,执行 file 中的命令,而不是标准的个人初始化
文件 ~/.bashrc (参见下面的 启动(INVOCATION) 章节)
shopt_option,-O 将设置那个选项的取值; +O 取消它。如果没有给
出 shopt_option,shopt 将在标准输出上打印设为允许的选项的名称
和值。如果启动选项是 +O,输出将以一种可以重用为输入的格式显示
。
-- 标志选项的结束,禁止其余的选项处理。任何 -- 之后的参数将作
--
Bash 也解释一些多字节的选项。在命令行中,这些选项必须置于需要被识别的单
字符参数之前。
--dump-po-strings
--dump-strings
--help 在标准输出显示用法信息并成功退出
--init-file file
--rcfile file
--login
--noediting
--noprofile
--norc 如果 shell 是交互的,不读取/执行个人初始化文件 ~/.bashrc 这个选
--posix
--restricted
如果默认操作与 POSIX 1003.2 标准不同的话,改变 bash 的行为来符合
标准 (posix mode)
不读取系统范围的启动文件 /etc/profile 或者任何个人初 始 化 文 件
~/.bash_profile,
bash 在作为登录 shell 启动时读取这些文件 (参见下面的 启 动(INVO-
CATION) 章节)
或 ~/.profile 。默认情况下,
~/.bash_login,
等价于 -D
等价于 -l
如果 shell 是交互的,不使用 GNU readline 库来读命令行
项在 shell 以 sh 命令启动时是默认启用的
shell 成为受限的 (参见下面的 受限的 shell(RESTRICTED SHELL) 章节)
产生一个为使脚本运行,需要的文件的列表。这个选项包含了 -n 选项。
它 是为了避免进行编译期错误检测时的限制-- Backticks, [] tests,
还有 evals 不会被解释,一些依赖关系可能丢失
--rpm-requires
--verbose
--version
参数(ARGUMENTS)
如果选项处理之后仍有参数剩余,并且没有指定 -c 或 -s 选项,第一个参数 将
假 定 为一个包含 shell 命令的文件的名字。如果 bash 是以这种方式启动的,
$0 将设置为这个文件的名字,位置参数将设置为剩余的其他参数。 Bash 从这个
文 件中读取并执行命令,然后退出。 Bash 的退出状态是脚本中执行的最后一个
命令的退出状态。如果没有执行命令,退出状态是 0。尝试的步骤是先试图打开在
当 前目录中的这个文件,接下来,如果没有找到,shell 将搜索脚本的 PATH 环
境变量中的路径。
启动(INVOCATION)
login shell 登录 shell,参数零的第一个字符是 - ,或者 启 动 时 指 定 了
--login 选项的 shell。
interactive 交互的 shell,是一个启动时没有指定非选项的参数,并且没有指
定 -c 选项,标准输出和标准输入都连接到了终端 (在
isatty(3) 中 判 定)
的 shell ,或者启动时指定了 -i 选项的 shell。如果 bash 是交互的, PS1 环
境变量将被设置,并且 $- 包含 i ,允许一个 shell 脚本或者一个启动文件 来
检测这一状态。
下 列段落描述了 bash 如何执行它的启动文件。如果这些启动文件中的任一个存
在但是不可读取, bash 将报告一个错误。文件名中的波浪号 (~,tilde)
EXPANSION 章节中 Tilde Expansion 段描述的那样展开。
当 bash 是作为交互的登录 shell 启动的,或者是一个非交互的 shell 但是指
定了 --login 选项,它首先读取并执行 /etc/profile 中的命令,只要那个文件
存 在 。 读 取 那 个 文 件 之 后 , 它以如下的顺序查找 ~/.bash_profile,
~/.bash_login, 和 ~/.profile, 从存在并且可读的第一个文件中读取并执行 其
等价于 -v
在标准输出显示此 bash 的版本信息并成功退出。
将 像
中的命令。 --noprofile 选项可以用来在 shell 启动时阻止它这样做。
当一个登录 shell 退出时, bash 读取并执行文件 ~/.bash_logout 中的命令,
只要它存在。
当一个交互的 shell 但不是登录 shell 启动时, bash 从文件 ~/.bashrc 中读
取 并 执行命令,只要它存在。可以用 --norc 选项来阻止它这样做。 --rcfile
file 选项将强制 bash 读取并执行文件 file 中的命令,而不是 ~/.bashrc 中
的。
当 bash 以非交互的方式启动时,例如在运行一个 shell 脚本时,它在环境中查
找变量 BASH_ENV ,如果它存在则将它的值展开,使用展开的值作为一个文件 的
名称,读取并执行。 Bash 运作的过程就如同执行了下列命令:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
但是没有使用 PATH 变量的值来搜索那个文件名。
如 果 bash 以名称 sh 启动,它试图模仿 (mimic) sh 历史版本的启动过程,尽
可能地相似,同时也遵循 POSIX 标准。当作为交互式登录 shell 启动时,或者是
非 交 互 但 使 用 了 --login 选项启动的时候,它首先尝试读取并执行文件
/etc/profile 和 ~/.profile, 中的命令. 选项 --noprofile 用于避免这种 行
为.当使用命令 sh 来启动一个交互式的 shell 时, bash 查找环境变量 ENV, 如
果有定义的话就扩展它的值,然后使用扩展后的值作为要读取和执行的文件 的 名
称. 由 于 使 用
--rcfile 没有意义.使用名称 sh 启动的非交互的 shell 不会读取任何其他启动
文件.当以 sh 启动时, bash 在读取启动文件之后进入 posix 模式.
当 bash 以 posix 模式启动时,(和使用 --posix 命令行参数效果相同),它遵循
POSIX 标准. 这种模式下,交互式 shell 扩展 ENV 环境变量的值,读取并执行以
扩展后值为文件名的配置文件. 不会读取其他文件.
Bash 试着检测它是不是由远程 shell 守护程序,通常为 rshd 启动的.如果 bash
发现它是由 rshd 启动的,它将读取并执行 ~/.bashrc 文件中的命令, 只要这 个
文件存在并且可读.如果以 sh 命令启动,它不会这样做. 选项 --norc 可以用来
阻止这种行为,选项 --rcfile 用来强制读取另一个文件,但是通常 rshd 不会 允
许它们, 或者用它们来启动 shell.
如果 shell 是以与真实用户(组) id 不同的有效用户(组) id 来启动的, 并且没
有 - 选项,那么它不会读取启动文件, 也不会从环境中继承 shell 函数. 环境变
量中如果出现 SHELLOPTS,它将被忽略.有效用户 id 将设置为真实用户 id. 如
果 启
sh 启动的 shell 不会读取和执行任何其他的启动文件,选项
了
-
动
时
给 出
一个空格或是 tab .
& ; ( ) < > space tab
一个 token(标识), 拥有控制功能. 它是如下符号之一:
|| & && ; ;; ( ) |
一个只由字母,数字和下划线构成的词,并且以字符或下划线起始. 也称为
一个 word identifier 标识符.
一个字符, 如果不是引用的话, 将成为词的分隔符. 它是如下字符之一:
|
选项,那么启动时的行为是类似的, 但是不会重置有效用户 id.
定义(DEFINITIONS)
下列定义在文档余下部分中通用.
blank 空白
word 词
一个字符序列, shell 将它们视为一个结构单元. 也称为一个 token 片段
。
name 名称
metacharacter 元字符
control operator 控制操作符
保留字("RESERVED WORDS")
Reserved
的, 如果不是引用, 并且不是一个简单命令的起始词 (参见 下 面 的 shell 语
法("SHELL GRAMMAR") ), 也不是 case 或者 for 命令的第三个词:
! case
while { } time [[ ]]
shell 语法("SHELL GRAMMAR")
Simple Commands 简单命令
simple command(简单命令) 是(可选的)一系列变量赋值, 紧接着是 blank(空格)
分隔的词和重定向, 然后以一个 control operator 结束. 第一个词指明了要执
行的命令, 它被作为第 0 个参数. 其余词被作为这个命令的参数.
simple command 简单命令的返回值是它的退出状态, 或是 128+n, 如果命 令 被
signal(信号) n 结束的话.
Pipelines 管道
pipeline(管道) 是一个或多个命令的序列,用字符 | 分隔。管道的格式是这样:
words( 保留字) 是对 shell 有特殊意义的词. 下列词被识别为保留
do done elif else esac fi for function if in select then until
[time [-p]] [ ! ] command [ | command2 ... ]
命令 command 的标准输出通过管道连接到命令 command2 的标准输入。连接是在
命令指定的任何重定向之前进行的(参见下面的 REDIRECTION 重定向)。
如 果保留字 ! 作为管道前缀,管道的退出状态将是最后一个命令的退出状态的
逻辑非值。否则,管道的退出状态就是最后一个命令的。 shell 在返回退出状态
值之前,等待管道中的所有命令返回。
如 果保留字 time 作为管道前缀,管道中止后将给出执行管道耗费的用户和系统
时间。选项 -p 将使输出符合 POSIX 指定的格式。环境变量 TIMEFORMAT 可以设
置 为 一 个格式字符串,指定时间信息应当如何显示;参见下面的 Shell Vari-
ables 环境变量中 TIMEFORMAT 的讲述。
管道中的每个命令都作为单独的进程来执行(即,在一个子 shell 中启动)。
Lists 序列
list(序列)是一个或多个管道,用操作符 ;, &, &&, 或 ││ 分隔的序列, 并且可
以选择用 ;, &, 或 新行符结束.
这些序列操作符中, && 和 ││ 优先级相同,其次是 ; 和 &, 它们的优先级是相
同的。
序列中可以有一个或多个新行符来分隔命令,而不是使用分号分隔。
如果一个命令是由控制操作符 & 结束的, shell 将在后台的子 shell 中执行 这
个 命令。 shell 不会等待命令执行结束,返回状态总是 0。以分号 ; 分隔的命
令会被顺序执行;shell 会等待每个命令依次结束。返回状态是最后执行的命 令
的返回状态。
控制操作符 && 和 ││ 分别代表 AND 和 OR 序列。一个 AND 序列的形式是
command2 只有在 command1 返回 0 时才被执行。
一个 OR 序列的形式是
command1 ││ command2
command1 && command2
的内建命令在命令结束后不会再起作用。返回值是序列的返回值。
不同, { 和 } 是 reserved words(保留字),必须
expression 将被求值。求值规则在下面的 算术求值 (ARITH-
表 达 式
METIC EVALUATION) 章节中描述。如果表达式的值非零,返回值就是 0;
否则返回值是 1。这种做法和 let "expression" 等价。
list 序列将在当前 shell 环境中执行。序列必须以一个新行符或分号结
束。这种做法也称为 group command(命令组)。返回值是序列的返回值。
注意与元字符 ( 和
出现在能够识别保留字的场合。由于它们不会产生断 词(cause a word
break),它们和序列之间必须用空格分开。
command2 只有在 command1 返回非 0 状态时才被执行。AND 和 OR 序列的返回
状态是序列中最后执行的命令的返回状态。
Compound Commands 复合命令
compound command(复合命令) 是如下情况之一:
(list) list 序列将在一个子 shell 中执行。变量赋值和影响 shell 环境变 量
{ list; }
((expression))
[[ expression ]]
返 回 0 或 1,取决于条件表达式 expression 求值的情况。表达式是由
下面 CONDITIONAL EXPRESSIONS 条件表达式章节中描 述 的 原 语(pri-
maries) 组成。 [[ 和 ]] 中的词不会进行词的拆分和路径的扩展处理;
而 tilde 扩展,参数和变量扩展,算术扩展,命令替换,函数替换和引用
的去除则都将进行。
当使用 == 和 != 操作符时,操作符右边的字符串被认为是一个模式,根
据下面 Pattern Matching(模式匹配) 章节中的规则进行匹配。如果匹配
则返回值是 0,否则返回 1。模式的任何部分可以被引用,强制使它作为
一个字符串而被匹配。
表达式可以用下列操作符结合起来。根据优先级的降序列出如下:
( expression )
返回表达式 expression 的值。括号可以用来提升操作符的优 先
级。
! expression
返回真,如果表达式 expression 返回假。
返回真,如果表达式 expression1 和 expression2 都返回真。
返 回真,如果表达式 expression1 或者 expression2 二者之一
返回真。
&&(与) 和 || 操作符不会对表达式 expression2 求值,如 果 expres-
sion1 可以决定整个条件表达式的返回值的话。
in 之后的一系列词会被扩展,产生一个项目列表。变量 name 被依次赋
以这个列表中的每个元素,序列 list 每次都被执行。如果 in word 被
忽略,那么 for 命令遍历已设置的位置参数(positional parameter,参
见下面的 PARAMETERS 参数),为每一个执行一次序列 list。返回值是最
后一个命令的返回值。如果 in 之后的词扩展的结果是空列表,就不会执
行任何命令,返回值是 0。
首先,算术表达式 expr1 被根据下面 算术求值 (ARITHMETIC EVALUA-
TION) 中的规则进行求值。然后算术表达式 expr2 被循环求值,直到它
等于 0。每次 expr2 结果非零时,序列 list 都被执行,算术 表 达 式
expr3 被求值。如果任何表达式被忽略,将被视为执行结果是 1。返回值
是序列 list 中被执行的最后一个命令的返回值;或者是 false,如果任
何表达式非法的话。
expression1 && expression2
expression1 || expression2
for name [ in word ] ; do list ; done
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
select name [ in word ] ; do list ; done
case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
in 之后的一系列词会被扩展,产生一个项目列表。这个扩展后的词集合
被输出到标准错误上,每个前面加上一个数字。如果 in word 被忽略 ,
将输出位置参数 (参见下面的 PARAMETERS 参数章节)。 PS3 提示符将被
显示出来,等待从标准输入得到一行输入。如果输入是一个数字且显示中
有对应的词,那么变量 name 的值将设置为这个词。如果输入一个空行,
那么词和提示符将再次显示出来。如果读入了一个 EOF,命令就结束。任
何 其 他 值将设置变量 name 为空。读入的行保存为变量 REPLY. 序列
list 在每次选择之后都会执行,直到执行了一个 break 命令。
select
的退出状态是序列 list 中执行的最后一个命令的退出状态,如果没有执
行命令就是 0。
case 命令首先扩展 word, 然后依次试着用每个 pattern 来匹配它, 使
用 与路径扩展相同的匹配规则(参见下面的 Pathname Expansion 路径扩