”$-”与shell默认选项
一、前言
之所以整理这篇博客,主要是写Linux环境设置文件 的时候,在查看/etc/profile时看到这么一段代码:
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
到底”$-”是什么意思,这引起了我的兴趣。
二、$-是什么
$-在脚本中,代表通过set命令传给脚本的标志位(Flags passed to script (using set).),也就是说$-记录着当前设置的shell选项,himBH是默认值,可以通过 set 命令来设置或者取消一个选项配置。
三、默认bash选项详解
1. i - interactive
包含这个选项说明当前的 shell 是一个交互式的 shell,何为交互式?你输入命令,shell 解释执行后给你返回结果,我们在 Terminal 下使用的 shell 就是交互式的,所以 $- 会包含 i 字符。如果我们在一个脚本里面 echo $-,结果是不会包含 i 的。
2. H - history expand
Shell 会把我们执行的命令记录下来,可以通过 history 命令查看,每一行是序号 + 执行的命令。在 shell 退出时,会将这些信息保存到~/.bash_history 文件中,当然在启动时也会从该文件中加载。history expand 就是展开历史列表中的命令,可以通过!感叹号来完成,例如"!!"返回上最近的一个历史命令,"!n"返回第 n 个历史命令。
3. B - brace expansion
开启大括号扩展,譬如,假如开了大括号扩展:
$ cp /your/path/to/file{,.bak}
相当于:
cp /your/path/to/file /your/path/to/file.bak
可以通过set +B来关闭这个功能,与前面几个选项不同的是,这个选项在脚本里面也是默认打开的。
4. m - monitor mode
打开监控模式,Bash 手册上后面还有一句话"Job control is enabled",Job control 是什么?就是说可以控制进程的停止、继续,后台或者前台执行等。
正常情况下,在交互式模式下,该选项默认是打开的,所以再执行一个比较耗时的命令时,你可以按下 CTRL+Z 让它在后台运行,然后可以用 fg 命令将后台运行的任务恢复到前台执行。
5. h - hashall
打开这个选项后,Shell 会将命令所在的路径记录下来,避免每次都要查询,在脚本中也默认开启。
最后,可以通过set -o命令来查看当前 shell 的选项配置。
三、${-#*i}是什么
${-#*i}是一个变量替换表达式,关于变量替换,可以看另外一篇文章:【类unix系统shell基础】1.07 变量。这个翻译过来是说,从左往右看,删除掉 $- 变量的值中第一个 i 字符以及之前的内容。
那么脚本的意思就很清楚了,如果执行环境是交互性的shell,则直接执行脚本,否则,执行脚本的时候不显示标准输出和错误输出。
四、参考
1. 《abs-guide》
(完)
随机推荐
- (转)完美解决 Android WebView 文本框获取焦点后自动放大有关问题
完美解决 Android WebView 文本框获取焦点后自动放大问题 前几天在写一个项目时,要求在项目中嵌入一个WebView 本来很快就完成了,测试也没有问题.但发给新加坡时,他们测试都会出现文本 ...
- Lombok 简单入门
原文地址:Lombok 简单入门 博客地址:http://www.extlight.com 一.前言 Lombok 是一个 Java 库,它作为插件安装至编辑器中,其作用是通过简单注解来精简代码,以此 ...
- Epel源配置
CentOS6的请编辑/etc/yum.repos.d/epel.repo输入以下内容 [epel] name=Extra Packages for Enterprise Linux 6 - $bas ...
- git 绑定远程仓方法
第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步.如果没有,打开Shell ...
- H3C IRF2的三种配置情况
H3C-IRF2-虚拟交换技术-强列鼻视看我文档不下载的呵呵.看了下面的东西你就会配IRF了. H3C-5120-HI H3C-5120S H3C5800 先到H3C官网上面看那些交换机支持IR ...
- Spring的常用下载地址
第一种,简单粗暴直接 1 http://repo.springsource.org/libs-release-local/org/springframework/spring/3.2.4.RELEAS ...
- ApacheOFBiz的相关介绍以及使用总结(一)
由于最近一段时间在给一个创业的公司做客户关系管理CRM系统,限于人力要求(其实是没有多少人力),只能看能否有稳定,开源的半成品进行改造,而且最好不需要前端(js)相关开发人员的支援就可以把事情做成,经 ...
- 019:InnoDB 表空间内部组织结构
一. 表空间内部组织结构 表空间 内部有多个段对象(Segment) 组成 每个段(Segment)由区(Extent) 组成 每个区(Extent)由页(Page)组成 每个页里面报存数据 (或者叫 ...
- MySQL升级指南
一 .MySQL升级 1.官方升级策略 注意 升级过程中必须使用具有管理权限的MySQL帐户来执行SQL语句. 1.升级方法 逻辑升级: 涉及使用 mysqldump从旧的MySQL版本导出现有数据 ...
- django-cbv模式-csrf中间件
1. django模式 def users(request): user_list = ['alex','oldboy'] return HttpResponse(json.dumps((user_l ...