一、前言

之所以整理这篇博客,主要是写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》

2. Shell 默认选项 himBH 的解释

(完)

随机推荐

  1. (QPS)TPS指标概述

    性能测试关注指标-TPS概述 一.TPS(Transaction per Second)定义 TPS是Transactions Per Second 的缩写,也就是事务数/秒.它是软件测试结果的测量单 ...

  2. redisTemplate 方法

    ClassPathXmlApplicationContext appCtx = new ClassPathXmlApplicationContext("spring-redis.xml&qu ...

  3. SpringMVC日志管理(自定义异常及自定义注解)

    近期为了规范公司老旧项目的日志,主要也是为了便于日后错误排查以及加强对业务系统的监控,准备对原有的日志输出进行简单的改造. 解决思路 1.通过自定义异常来将可能出现的问题分为两大类,业务类及系统类.同 ...

  4. centos7系统安装python3,pip3,django

    首先去python官网下载python3的源码包,网址:https://www.python.org/ 或者直接wget下载 wget https://www.python.org/ftp/pytho ...

  5. Spark-1.5.2安装--Standalone和Yarn

    Spark Standalone 1.下载scala-2.10.6包解压到指定目录,添加环境变量 #SCALA VARIABLES START export SCALA_HOME=/usr/local ...

  6. 【学习笔记】dp基础

    知识储备:dp入门. 好了,完成了dp入门,我们可以做一些稍微不是那么裸的题了. dp基础,主要是做题,只有练习才能彻底掌握. 洛谷P1417 烹调方案 分析:由于时间的先后会对结果有影响,所以c[i ...

  7. json data 解析demo

    json data: demo: JsonObject jsonObject= JsonHandle.getAsJsonObject(city_dataInfo).get("data&quo ...

  8. Java多线程同步机制(synchronized)

    参看:http://enetor.iteye.com/blog/986623

  9. 在ubuntu中添加新硬盘

    在ubuntu中添加新硬盘 转载于 http://www.cnblogs.com/unipower/archive/2009/03/08/1406230.html  前言 安装新硬盘这种事情并不会经常 ...

  10. C#读取Excel技术概览 (2)

    5.自定义SDK,使用xmlReader文件流式处理 第四章节中,总是感觉用别人的工具要受制于人.既然我 们知道了Excel的存储方式,问题便转换成从xml中取出数据,然后放入内存得到我们想要的东西, ...