一、前言

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

    mac下连接linux 1 iTerm2 方式一: 在iTerm2的命令行下,输入: //-p端口号(linux默认是22),用户名@linux的IPssh -p 22 username@ip//按e ...

  2. git还原某个特定的文件到之前的版本

    场景: 对于某个git控制下的文件进行了修改,但是改的不满意,想退回到改之前的版本.假定该文件为 src/main/main.c 解决方法: 第一步: 在命令行中输入 git log src/main ...

  3. golang调用动态库

    测试动态库 test_so.h int test_so_func(int a,int b); test_so.c #include "test_so.h" int test_so_ ...

  4. javascript基础-js继承

    1.prototype方式 示例:没有使用prototype(下列这些代码只能获取array1数组的总和,而无法对array2数据进行求和) var array1 = new Array(1,4,9, ...

  5. GOF23设计模式之状态模式(state)

    一.状态模式概述 用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题. 结构: (1)Context 环境类   环境类中维护一个 State 对象,它定义了当前的状态. (2)State ...

  6. python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)

    print(train_set.tdm) print(type(train_set.tdm)) 输出得到: (0, 3200) 0.264940780338 (0, 1682) 0.356545827 ...

  7. Codeforces-591C题解

    一.题目链接 http://codeforces.com/problemset/problem/591/C 二.题意 给定一个只含数字0和1的数组,通过如下方式,变成不再变化的01组合,最少需要操作几 ...

  8. 谷歌强制厂商升级KitKat 仍无法改善安卓碎片化

    据一份泄露的内部文档显示,谷歌计划推出新的Android版本及设备审批条例,限制硬件制造商推出Android 4.4 KitKat以下的旧版本硬件,来改变平台碎片化现象.如果厂商一意孤行,继续推出搭载 ...

  9. redis存session问题测试内容

    转至元数据起始   官网,现网由于是双节点,session是存储在redis作为共享的. +1是单节点.目前是存储成文件的 本次的问题根源是 由于 session是存储在redis,所造成的. 所以需 ...

  10. php中$_POST接收不到参数问题

    问题描述:PHP可以接收_GET._SERVER._COOKIE等参数,php://input可以读取没有处理过的POST数据,独独_POST接收不到post参数.  原因: php://input可 ...