bash参考手册之六(Bash特性)续七

来源:互联网 发布:网络课考古发现与探索 编辑:程序博客网 时间:2024/05/16 14:35

6.10 限制shell


如果Bash使用rbash启动,或者调用时使用了 --restricted 或者 -r 选项,则shell变成受限制的shell。一个受限shell用于建立一个比标准shell更加受控制的环境。受限shell的行为除下列不允许的或者不执行的命令外,与bash完全一致:

* 使用内建命令 cd 改变目录。 

* 设置或取消设置变量: SHELL, PATH, ENV, or BASH_ENV。

* 指定包含斜杠的命令名。

* 把包含斜杠的文件名作为内建命令 . 的参数。

* 包含斜杠的文件名作为内建命令 hash 的选项 -p 的参数。

* 在启动时,从shell环境导入函数定义。

* 在启动时,解析shell环境的 SHELLOPTS 的值。

* 使用 ‘>’, ‘>|’, ‘<>’, ‘>&’, ‘&>’, 和 ‘>>’ 重定向操作符重定向输出。

* 使用内建命令 exec 用某个命令代替shell。

* 内建命令 enable带-f 和 -d 选项,以增加或删除内建命令。 

* 使用内建命令 enable 启用/禁止shell内建命令。

* 指定 -p 选项给内建命令 command。

* 使用 ‘set +r’ 或 ‘set +o restricted’ 关闭模式。

在读取启动文件后,这些限制被强制执行。
当被执行的命令是一个shell脚本时,(见 shell脚本),rbash 关闭所有为执行该脚本产生的shell限制。


6.11 Bash POSIX 模式


使用 --posix 命令行选项启动Bash,或者Bash运行时,执行 ‘set -o posix’ ,会引起Bash通过改变它的默认行为,使之更加符合POSIX 标准。

当使用 sh 调用时, Bash在读取启动文件后进入 POSIX 模式。


下表列出了 POSIX 模式生效时的那些变化。

1.当一条命令不在哈希表中时,Bash要重新搜索 $PATH ,以查找新的位置。也可以通过命令启用, ‘shopt -s checkhash’ 。

2.当一个作业以非0状态退出时,作业控制码和内建命令打印的消息是 ‘Done(状态码)’ 。

3.当一个作业以非0状态停止时,作业控制码和内建命令打印的消息是 ‘Stopped(signame)’ ,其中的 signame 是,类似 SIGTSTP的信号名字。

4.内建命令bg使用提供的格式来描述位于背景的每一个作业,不包括该作业是否是当前作业或者前一个作业的一个指示符。

5.内容中出现的能够被识别的保留字时,不执行别名扩展。

6.POSIX PS1 和 PS2 扩展 ‘!’ 为历史序号,扩展 ‘!!’ 为 ‘!’ ,并且,PS1 和 PS2 的值要执行参数扩展,而不管选项 promptvars 的设置值。

7.执行POSIX启动文件($ENV),而不是普通的Bash文件。

8.仅仅在一个命令名前的赋值中执行波浪线扩展,而非在该行所有赋值语句中执行。 

9.默认历史文件是  ~/.sh_history 。(它是 $HISTFILE 的默认值)

10. ‘kill -l’ 的输出在单一行中打印所有的信号名,用空格分隔,不使用 ‘SIG’ 前缀。

11.内建命令 kill 不接受带 ‘SIG’ 前缀的信号名。

12.如果  . filename 的  filename 找不到,则非交互shell退出。

13.如果在算术表达式中发生语法错误导致无效表达式,则非交互shell退出。

14.如果使用内建命令 . 或者 source 命令读取的脚本中,或者内建命令 eval 处理字符串时,发生错误,则非交互shell退出。

15.除非shell是交互式的,重定向操作符不在重定向中的单词上执行文件名扩展。

16.重定向操作符不在重定向中的单词上执行分词。

17.函数名必须是有效的shell 名字。即,不能包含除字母、数字、下划线以外的字符,不能以数字开头。在非交互式shell中,声明一个无效名字的函数,将导致致命的语法错误。

18.POSIX特有的内建命令,在命令搜索时,在shell函数之前查找。

19.time保留字可以作为命令。当作为命令使用时,它显示对于shell和它已经完成的子shell的时间统计。TIMEFORMAT 变量控制了时间信息的格式。

20.当解析和扩展位于双引号中的 ${…} 表达式时,单引号不再保留特殊含义,且不能用于包括闭合的花括号,或者其他特殊字符,除非操作符是已经定义的执行模式移除的操作符之一。此时,单引号无需成对出现。

21.如果下一个字段以 ‘-’ 开头,则 time 不被认为是保留字。

22.如果一个 POSIX 特有的内建命令返回一个错误状态,则非交互shell退出。致命错误是那些列在POSIX标准的,以及包括传递错误的选项,重定向错误,命令名前面的赋值中的变量赋值错误,等等。

23.当没有命令名字跟在赋值语句后面时,如果发生一个变量赋值错误,则一个非交互shell会退出并且是错误状态。例如,当试图赋值给只读变量时,发生变量赋值错误。

24.当一个赋值语句后跟一个特有内建命令,但是没有其他简单命令时,如果发生一个变量赋值错误,则一个非交互shell会退出并且是错误状态。

25.当一个 for 语句中的循环变量 或者在 select 语句中的选择变量是一个只读变量时,一个非交互shell会退出并且是错误状态。

26.进程替换不可用。

27.POSIX特有内建命令前面的赋值语句,在内建命令完成后,在shell环境中保持效果。

28.shell函数调用前面的赋值语句,在shell函数返回后,在shell环境中保持效果,类似POSIX特有内建命令的情况。

29.内建命令 export 和 readonly 显示的输出格式符合 POSIX 标准。

30.内建命令 trap 显示的信号名字不包括前面的SIG。

31.内建命令 trap 对一个可能的信号说明不检查第一个参数,并且把对该信号的处理返还给原始的处理者,除非该参数只由数字组成,并且是有效的信号数。如果用户打算对给定信号重置处理器到原始的处理者,则需要使用 ‘-’ 作为第一个参数。

32.内建命令 . 和 source 如果在搜索 PATH 时找不到文件名参数时,不在当前目录中搜索。

33.子shell产生的可执行命令替换,从父shell继承-e选项的值。当不在POSIX模式时,Bash在该子shell中清除 -e 选项。

34.别名扩展总是启用,即使在非交互shell。

35.当内建命令 alias  显示别名定义时,它不显示开头的 ‘alias ’ ,除非带 -p 选项。

36.当内建命令 set 不带选项调用时,它不显示shell函数和定义。

37.当内建命令 set 不带选项调用时,它显示变量值时不带引号,即使结果包含非打印字符,除非包含shell元字符。

38.当内建命令 cd 以 逻辑模式调用时,并且来自 $PWD和提供的目录名组成的 路径名作为参数,没有指向一个存在的路径, 则 cd 将失败,而不是回退到 物理模式。

39.内建命令 pwd 验证它打印的值和当前目录一致,即使不带-P选项。

40.当列历史时,内建命令 fc 不包括一条历史命令是否被修改过的标识。

41.fc的默认编辑器是ed。

42.内建命令 type 和 command 不会报告一个被找到的文件是非可执行文件,如果该文件是在 $PATH 中找到的唯一同名文件,而shell则试图执行该文件。

43.当运行 ‘v’ 命令时, vi 编辑模式会直接调用vi编辑器,而不是检查 $VISUAL和 $EDITOR。

44.当启用了 xpg_echo 选项时,Bash不再试图解释echo的参数为选项。在转义字符转换后,每个参数都显示。

45.内建命令 ulimit 对于 -c 和 -f 选项,使用512字节作为块大小。

46.当陷阱被设置成 SIGCHLD 时,信号SIGCHLD的到来,不会中断内建命令 wait,并导致立即返回。对于每个退出的子shell,trap命令都要运行一次。


还有一些其他的POSIX行为,Bash在默认情况下没有实现,即使在POSIX 模式下。特别地:
1.如果 FCEDIT 没有设置,则内建命令 fc 检查 $EDITOR 是否是编辑历史的命令,而不是默认地指向ed。如果 EDITOR 未设置,fc使用ed。
2.如上所述,Bash需要 xpg_echo 选项启用,以使内建命令echo 完全动作。

Bash可以配置成默认POSIX兼容模式,通过在编译时,给 configure 指定 --enable-strict-posix-default  选项。(见 可选特性 章节)




0 0