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

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  选项。(见 可选特性 章节)




译者序毫无疑问,UNIX/Linux最重要的软件之一就是shell,目前最流行的shell被称为Bash(Bourne Again Shell),几乎所有的Linux和绝大部分的UNIX都可以使用Bash。作为系统与用户之间的交互接口,shell几乎是你在UNIX工作平台上最亲密的朋友,因此,学好shell,是学习Linux/UNIX的的开始,并且它会始终伴随你的工作学习。shell是如此地重要,但令人惊奇的是,介绍shell的书没有真正令人满意的。所幸的是,我看到了这本被人称为abs的书,这本书介绍了bash大量的细节和广阔的范围,我遇到的绝大部分的技术问题--无论是我忘记的或是以前没有发现的--都可以在这本书里找到答案。这本使用大量的例子详细地介绍了Bash的语法,各种技巧,调试等等的技术,以循序渐进的学习方式,让你了解Bash的所有特性,在书中还有许多练习可以引导你思考,以得到更深入的知识。无论你是新手还是老手,或是使用其他语言的程序员,我能肯定你能在此书用受益。而本书除了介绍BASH的知识之外,也有许多有用的关于Linux/UNIX的知识和其他shell的介绍。在看到本书的英文版后,我决定把它翻译出来,在Linuxsir论坛上结识了译者之一杨春敏共同翻译这本书,600多页的书是本大部头的书,我们花了6个月的业余时间才翻译完了。关于版权的问题,英文版的作者Mendel Cooper对英文版的版权做了详细的约定,请参考:Appendix Q. Copyright。中文版版权由译者杨春敏和黄毅共同所有,在遵守英文版版权相应条款的条件下,欢迎在保留本书译者名字和版权说明以非盈利的方式自由发布此中文版,以盈利目的的所有行为必须联系英文作者和两位中文译者以获得许可。本书得以成稿,我(黄毅)要多谢我的女朋友,本该给予她的时间我用来了翻译,多谢你的理解,你是一个很棒的女朋友! 译者 杨春敏 黄毅 2006.5.15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值