Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

10.2. Bash (Bourne-Again Shell)

红帽企业版 Linux 6 包含 Bash 的版本4.1 作为它默认的 shell。这部分描述了这个版本较于先前版本带来的兼容性问题。
  • Bash-4.0 或者之后的版本现在允许进程替换组成使用大括号扩展传递将未更改的内容,因此将必须分别指定内容扩展,且将必须分别输入每个进程替换。
  • Bash-4.0 或者之后的版本现在允许 SIGCHLD 中断等待的 builtin,如 Posix 所指定的,因此如果您使用的是 `wait' 等待所有子进程,则不再总是根据每个现有子进程调用 SIGCHLD 信号陷阱。
  • Bash-4.0 或者之后的版本现在按照 Posix 规则查找替换 $() 命令的关闭定义符,它的行为较之前的版本有所不同,但将在产生 subshell 前捕获更多的语法和解析错误,以便评价命令替换。
  • 把命令行分解成词时可编程完成代码使用同组定界字符作为 readline,而不是一组 shell 元字符,所以可编程完成代码和 readline 会更加统一。
  • 当读取 builtin 超时时,它会尝试为指定的变量分配任意输入读取,如没有足够的输入,它还可导致将变量设定为空字符串。之前的版本忽略字符读取。
  • 在 Bash-4.0 或者之后的版本中,当在 pipeline 中的一个命令被 SIGINT 杀死的同时执行一组命令,则 shell 的表现是好像它收到了中断。
  • Bash-4.0 以及更新的版本更改了处理 set -e 选项的方法,以便在 pipeline 失败时可使用 shell(且不单纯是失败的 pipline 行中的最后一个命令是一个简单命令)。这不是如 Posix 所指定。目前正着手解决更新标准的这一部分。Bash-4.0 的行为是试图在发行时获得一致意见。
  • Bash-4.0 和之后的版本修复了 Posix 模式的缺陷。这个缺陷导致即使 "." 不在 PATH 系统,. (source) 内建指令也会在现有目录搜索文件名参数。Posix 指出 shell 在这种情况下不应该在 PWD 变量中查找。
  • 在比较 [[ 命令中使用运算符的字符串时,Bash-4.1 使用当前定位。可通过设定 compatNN shopt 选项之一恢复成之前的行为。

10.2.1. 正则表达式

进一步说明已列出的点,引用模式参数到正则表达式匹配条件运算符 =~ 可能引起 regexp 匹配停止工作。这在所有结构中都是可能发生的。在先于3.2版本 的 bash 中,引用正则表达式到 [[ 命令的 =~ 运算符的效果不是指定的。实际效果是,双引号引用模式参数需要反斜杠来引用特殊模式符号,这妨碍了双引号引用字扩展执行的反斜杠处理,并且与 == shell 模式匹配运算符处理引用字符的方法不一致。
bash 版本 3.2 中,将 shell 更改为在 =~ 运算符中使用由单引号和双引号引用的字符串参数中的内部引用字符,这样就限制了对处理 (`.', `[', `\', `(', `), `*', `+', `?', `{', `|', `^', 和 `$') 并强制其按字面意思匹配的常规表达式的字符的特殊含义。这与 == 模式和运算符处理括号内的模式参数映射的方法是一致的。
由于引用字符串参数的处理方式已经改变,一些问题就出现了。其中主要的问题就是模式参数中的空格问题和 bash 3.1 与 bash 3.2 之间被引用字符串的不同处理方式的问题。这两个问题都可以通过使用 shell 变量保持此模式来解决。当在所有 [[ 命令操作数中扩展 shell 变量时,不执行分词,这提供了让您在分配变量时按照所想来引用模式的能力,然后您可以扩展值到可以包含空格的单个字符串。第一个问题可以通过使用反斜杠或其它引用机制来回避模式中的空格。
Bash 4.0 引进了兼容性等级的概念,这是有一些 shopt 内键指令的选项控制的。如果启用了 compat31 选项,则 bash 将会恢复到 3.1 版本的行为方式,并引用右首的 =~ 运算符。