”$-”与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》
(完)
随机推荐
- [LeetCode系列] 二叉树最大深度求解问题(C++递归解法)
问: 给定二叉树, 如何计算二叉树最大深度? 算法描述如下: 如果当前节点为空, 返回0(代表此节点下方最大节点数为0) 如果当前节点不为空, 返回(其左子树和右子树下方最大节点数中的最大值+1) 上 ...
- bzo1007 [HNOI2008]水平可见直线
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1007 所有可见直线形成下凸壳的样子.而且交点横坐标递增. (特殊判断平行线.但是按b从小到大 ...
- openOffice转换的时候乱码在linux下使用openOffice的时候发现在转换后出现了乱码
openOffice转换的时候乱码 在linux下使用openOffice的时候发现在转换后出现了乱码,最后上网查了一下,按照网上的说法去试了试,最后也没有解决,也可能是我这边的linux的权限问题, ...
- mac下导出JetBrains IDE Support插件给linux
自从google被和谐以后,上google的store安装插件是如此的费劲,好在mac下的chrome已经装好了,直接导出给linux就可以 mac下chrome的插件目录为 ~/Library/Ap ...
- 基于INTEL FPGA硬浮点DSP实现卷积运算
概述 卷积是一种线性运算,其本质是滑动平均思想,广泛应用于图像滤波.而随着人工智能及深度学习的发展,卷积也在神经网络中发挥重要的作用,如卷积神经网络.本参考设计主要介绍如何基于INTEL 硬浮点的DS ...
- [转]MySQL 经验集
-- my.ini -> 在 [mysqld] 节点下加入一行 skip-grant-tables 然后重启服务 -- 接下来无密码登录到 mysql 执行以下命令 use mysql show ...
- python解析时间格式脚本
对于这种时间格式:發表於: 星期一 五月 28, 2012 6:59 am import re INPUT = "發表於: 星期一 五月 28, 2012 6:59 am 文章主題: 對&l ...
- 【BZOJ】2938 [POI2000]病毒(AC自动机)
题目 传送门:QWQ 传送到洛谷QWQ 分析 夏爷爷传送门 代码 #include <bits/stdc++.h> using namespace std; ; ][], fail[N*] ...
- Python实践练习:电话号码和 E-mail 地址提取程序
题目: 假设你有一个无聊的任务,要在一篇长的网页或文章中,找出所有电话号码和邮件地址.如果手动翻页,可能需要查找很长时间.如果有一个程序,可以在剪贴板的文本中查找电话号码和 E-mail 地址,那你就 ...
- git之常用命令
git之常用命令 1.下载远程仓库最新代码 $ git pull --rebase origin master 2.上传代码 $ git push origin master 3.退出编辑 ESC + ...