
字词转换是中文维基的一项自动转换,目的是通过计算机程序自动消除繁简、地区词等不同用字模式的差异,以达到阅读方便。
字词转换包括全局转换和手动转换,本说明所使用的标题转换和全文转换技术,都属于手动转换。
|
GNU Bourne-Again Shell |
|
|---|---|
bash会话的一个截屏 |
|
| 开发 | Chet Ramey |
| 最近版本 | 3.2.39 / 2008年4月30日 |
| 操作系统 | 多系统 |
| 类型 | Unix shell |
| 许可协议 | GNU General Public License |
| 网站 | [1] |
|
查看 • 讨论 • 编辑 • 历史
|
|
bash 是一个为GNU项目编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语 (Bourne again / born again)。Bourne shell是一个早期的重要shell,由Stephen Bourne在1978年前后编写,并同Version 7 Unix一起发布。bash则在1987年由Brian Fox创造。在1990年,Chet Ramey成为了主要的维护者。
bash是大多数Linux系统以及Mac OS X v10.4默认的shell,它能运行于大多数Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现windows的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。
目录 |
bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有那些引用了Bourne特殊变量或使用了Bourne的内置命令的脚本才需要修改。 bash的命令语法很多来自Korn shell (ksh) 和 C shell (csh), 例如命令行编辑,命令历史,目录栈,$RANDOM 和 $PPID 变量,以及POSIX的命令置换语法: $(...)。作为一个交互式的shell,按下TAB键即可自动补全已部分输入的程序名,文件名,变量名等等。
bash的语法针对Bourne shell的不足做了很多扩展。其中的一些列举在这里。
与Bourne shell不同的是bash不用另外生成进程即能进行整数运算。bash 使用((...)) 命令和 $[...] 变量语法来达到这个目的:
VAR=55 # 将整数 55 赋值给变量 VAR ((VAR = VAR + 1)) # 变量 VAR 加 1。 注意这里没有 '$' ((++VAR)) # 另一种方法给 VAR 加 1。 使用C语言风格的前缀自增 ((VAR++)) # 另一种方法给 VAR 加 1。 使用C语言风格的后缀自增 echo $[VAR * 22] # VAR 乘以 22 并将结果送入命令 echo $((VAR * 22)) # 同上
((...)) 命令可以用于条件语句,因为它的退出状态是0或者非0(大多数情况下是1),可以用于是与非的条件判断:
if ((VAR == Y * 3 + X * 2))
then
echo Yes
fi
((Z > 23)) && echo Yes
((...)) 命令支持下列比较操作符:'==', '!=', '>', '<', '>=', 和 '<='。
bash不能在自身进程内进行浮点数运算。当前有这个能力的unix shell只有Korn shell 和 Z shell.
bash拥有传统Bourne shell 缺乏的I/O重定向语法。bash可以同时重定向标准输出和标准错误,这需要使用下面的语法:
command &> file
这比等价的Bourne shell语法 "command > file 2>&1" 来的简单。2.05b版本以后,bash可以用下列语法重定向标准输入至字符串(称为here string):
command <<< "string to be read as standard input"
如果字符串包括空格就需要用引号包裹字符串。
例子: 重定向标准输出至文件,写数据,关闭文件,重置标准输出。
# 生成标准输出(文件描述符1)的拷贝文件描述符6 exec 6>&1 # 打开文件"test.data"以供写入 exec 1>test.data # 产生一些内容 echo "data:data:data" # 关闭文件 "test.data" exec 1>&- # 使标准输出指向FD 6 (重置标准输出) exec 1>&6 # 关闭 FD6 exec 6>&-
打开及关闭文件
# 打开文件 test.data 以供读取 exec 6<test.data # 读文件直到文件尾 while read -u 6 dta do echo "$dta" done # 关闭文件 test.data exec 6<&-
抓取外部命令的输出
# 运行'find'并且将结果存于 VAR # 搜索以"h"结尾的文件名 VAR=$(find . -name "*h")
bash 3.0 支持进程内的正则表达式,使用下面的语法 :
[[ string =~ regex ]]
正则表达式语法同regex(7) man page 所描述的一致。正则表达式匹配字符串时上述命令的退出状态为0,不匹配为1。正则表达式中用圆括号括起的子表达式可以访问shell变量 BASH_REMATCH ,如下:
if [[ abcfoobarbletch =~ 'foo(bar)bl(.*)' ]]
then
echo The regex matches!
echo $BASH_REMATCH -- outputs: foobarbletch
echo ${BASH_REMATCH[1]} -- outputs: bar
echo ${BASH_REMATCH[2]} -- outputs: etch
fi
使用这个语法的性能要比生成一个新的进程来运行 grep 命令优越,因为正则表达式匹配在bash进程内完成。如果正则表达式或者字符串包括空格或者shell 关键字,(诸如 '*' 或者 '?'),就需要用引号包裹。
$'string'形式的字符串会被特殊处理。字符串会被展开成 string,并像C语言那样将反斜杠及紧跟的字符进行替换。反斜杠转义序列的转换方式如下:
| 转义字符 | 扩展成 ... |
|---|---|
| \a | 响铃符 |
| \b | 退格符 |
| \e | ANSI转义符,等价于\033 |
| \f | 馈页符 |
| \n | 换行符 |
| \r | 回车符 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \\ | 反斜杠 |
| \' | 单引号 |
| \nnn | 十进制值为nnn的8-bit字符(1-3位) |
| \xHH | 十六进制值为HH的8-bit字符(1或2位) |
| \cx | control-X 字符 |
扩展后的结果将被单引号包裹,就好像美元符号一直就不存在一样。
双引号包裹的字符串前若有一个美元符号 ($"...") 将会使得字符串被翻译成符合当前locale的语言。如果当前locale是 C 或者 POSIX,美元符号会被忽略。如果字符串被翻译并替换,替换后的字符串仍被双引号包裹。
bash启动的时候会运行各种不同的脚本。
当bash作为一个登录的交互shell被调用,或者作为非交互shell但带有--login参数被调用时,它首先读入并执行文件/etc/profile。然后它会依次寻找 ~/.bash_profile,~/.bash_login,和 ~/.profile,读入并执行第一个存在且可读的文件。 --noprofile 参数可以阻止bash启动时的这种行为。
当一个登录shell退出时,bash读取并执行 ~/.bash_logout 文件,如果此文件存在。
当一个交互的非登录shell启动后,bash读取并执行 ~/.bashrc 文件。这个行为可以用 --norc 参数阻止。--rcfile file 参数强制 bash 读取并执行指定的 file 而不是默认的 ~/.bashrc。
如果用 sh 来调用bash,它会尽可能模仿sh历史版本的启动行为,以便遵守POSIX标准。当bash作为登录的交互shell被调用时,或者作为非交互的但带有--login参数被调用时,它首先依次读入并执行/etc/profile 和 ~/.profile。--noprofile 参数可以阻止这行为。当以 sh 的名字作为交互shell被调用时,bash 寻找变量 ENV,扩展它的值,并使用扩展的值作为要读取运行的文件名。以名字 sh 被调用的shell不会去寻找并读取其他启动脚本, --rcfile 参数无效。用 sh 名字调用的非交互shell不会去读取其他启动脚本。当用 sh调用bash时,bash在启动后进入posix模式。
当bash以 POSIX 模式启动时(例如带有 --posix 参数)它使用POSIX标准来读取启动文件。在此模式下,交互 shells 扩展变量 ENV ,从以此为文件名的文件中读取命令并执行。bash不会读取其他文件。
bash会探测自己是不是被远程shell守护程序运行(通常是rshd)。如果是,它会读取并执行 ~/.bashrc中的命令。如果是被sh调用,它就不会这么做。 --norc 参数可以组织这行为,--rcfile 参数可以强制读取另一个文件,但是 rshd 一般不会用这些参数调用shell,也不会允许这些参数可以被指定。
|
查 • 论 • 编 • 历
|
||
|---|---|---|
| 历史 | GNU宣言 · GNU计划 · 自由软件基金会 · 自由软件历史 | |
| GNU许可证 | GNU通用公共许可证 · GNU宽通用公共许可证 · GNU自由文档许可证 · GPL linking exception | |
| 软件 | GNU (Variants) · GNOME · Gnuzilla · Gnash · Bash · GCC · GNU Emacs · GNU C 函式库 · Coreutils · GNU build system · Other GNU packages and programs | |
| 发言人 | Robert J. Chassell · Loïc Dachary · Ricardo Galli · Georg C. F. Greve · Federico Heinz · Benjamin Mako Hill · Bradley M. Kuhn · 伊本·莫格林 · Brett Smith · 理查德·斯托曼 · John Sullivan | |
Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History