设置的shell选项
$-记录着当前设置的shell选项,himBH是默认值
command
echo $-
himBH
set -x #这个可以打开 shell 的调试开关
echo $-
himxBH
himBH 上这几个默认选项对 Shell的影响
1. H - history expand
我们知道 Shell 会把我们执行的命令记录下来,可以通过 history 命令查看,每一行是序号 + 执行的命令。在 shell 退出时,会将这些信息保存到~/.bash_history 文件中,当然在启动时也会从该文件中加载,不信删除这个文件再打开一个终端试试。
history expand 就是展开历史列表中的命令,可以通过!感叹号来完成,例如"!!"返回上最近的一个历史命令,"!n"返回第 n 个历史命令,等等。
备注:在命令行下,不要在双引号号里面用!,这会让 Shell "误以为" 你要执行历史展开
$ echo "hello world!"
-bash: !": event not found
解决方法有两种:使用单引号或者关闭历史展开功能(在脚本里面默认是关闭的):
$ echo 'hello, world!'
hello, world!
$ set +H #关闭开关
$ echo "hello, world!"
hello, world!
2.Brace expansion
$ cp /your/path/to/file{,.bak}
很多时候大家需要备份某个文件时,非常头疼的一点就是要重复输入长长地路径,利用 Brace expansion 就可以轻松搞定。
set +B #关闭这个功能
3.m - monitor mode
字面意思是说打开监控模式,Bash 手册上后面还有一句话"Job control is enabled",Job control 是什么?就是说可以控制进程的停止、继续,后台或者前台执行等。
正常情况下,在交互式模式下,该选项默认是打开的,所以再执行一个比较耗时的命令时,你可以按下CTRL+Z 让它在后台运行,然后可以用 fg 命令将后台运行的任务恢复到前台执行:
$ sleep 10
+ sleep 10
^Z
[1]+ Stopped sleep 10
$ fg
+ fg
sleep 10
如果关闭这个选项,你就失去了控制 Job 的能力:
4.h - hashall
Shell 会将命令所在的路径记录下来,避免每次都要查询。
我们要验证下这个猜测,首先在/usr/bin 下创建任意一个可执行的文件:
[kodango@mac] ~
$ echo "test hashall" | sudo tee /usr/bin/kodango && sudo chmod +x /usr/bin/kodango
[kodango@mac] ~
$ kodango
test hashall
[kodango@mac] ~
$ sudo mv /usr/bin/kodango /usr/local/bin/kodango
[kodango@mac] ~
$ kodango
-bash: /usr/bin/kodango: No such file or directory
好吧,果不其然,“缓存”失效了。接下来,我们关闭这个选项:
[kodango@mac] ~
$ set +m
[kodango@mac] ~
$ kodango
test hashall
[kodango@mac] ~
$ which kodango
/usr/local/bin//kodango
现在工作正常了,不过谁会经常没事瞎移动命令呢?所以这个选项默认都是打开的。
最后,你也可以通过set -o命令来查看当前 shell 的选项配置。