:~> echo $-
himBH
$-
记录的是当前配置打开的 shell 选项,而 himBH
是其默认值。
himBH
每个字母都代表了一个 shell 选项,具体如下:
h - hashall
i - interactive-comments
m - monitor
B - braceexpand
H- history
可以通过 set -o 查看来确认打开状态:
:~> set -o | grep -w on
braceexpand on
hashall on
history on
interactive-comments on
monitor on
那么, himBH
每一项,具体表示什么意思呢?
bash 的 hash 功能,可以实现让某些 command 和 具体路径 绑定在一起。
比如:
:~> hash -p /tmp/fakedate date
:~> hash -l | grep fakedate
builtin hash -p /tmp/fakedate date
:~> date
-bash: /tmp/fakedate: No such file or directory
:~> set +h
:~> date
Sun Jan 19 15:43:18 CST 2020
:~> set -h
:~> date
-bash: /tmp/fakedate: No such file or directory
:~> hash -d date
:~> date
Sun Jan 19 15:43:53 CST 2020
关于 hash 命令的更多使用介绍,可戳 《 Linux hash table 学习笔记 》 了解。
配置在交互 shell 模式下,是否允许注释。
:~> set +o interactive-comments
:~> echo $-
hmBH
:~> echo $-
hmBH
:~> #testcomment
-bash: #testcomment: command not found
:~> set -o interactive-comments
:~> echo $-
himBH
:~> set -o | grep on | grep interactive-comments
interactive-comments on
:~> #testcomment
如果对 “交互 shell 模式” 存疑,可戳 《 交互 shell 与非交互 shell 的区别 》 释疑。
配置是否打开控制
Job control
功能。
Job control
是什么? 即可以控制进程的停止、继续,后台或者前台执行等。
开启 job control
后,如果执行了一个比较耗时的命令,可以按下 CTRL+Z
让它在后台运行:
:~> sleep 50
^Z
[1]+ Stopped sleep 50
然后, 可以用 fg
命令将后台运行的任务恢复到前台执行:
:~> fg
sleep 50
^C
如果关闭这个选项,就会失去控制 Job 的能力:
:~> set +m
:~> echo $-
hiBH
:~> sleep 50
^Z
^Z
^C
:~> fg
-bash: fg: no job control
关于括号使用的flag,打开后可以快捷地实现某些效果
快捷输出多个字符串:
:~> echo testbraceexpand{1..10}
testbraceexpand1 testbraceexpand2 testbraceexpand3 testbraceexpand4 testbraceexpand5 testbraceexpand6 testbraceexpand7 testbraceexpand8 testbraceexpand9 testbraceexpand10
:~> set +B
:~> echo $-
himH
:~> echo testbraceexpand{1..10}
testbraceexpand{1..10}
快捷备份:
:~> echo $-
himH
:~> cp /tmp/myfile{,.bak}
cp: missing destination file operand after '/tmp/myfile{,.bak}'
Try 'cp --help' for more information.
:~> set -B
:~> echo $-
himBH
:~> cp /tmp/myfile{,.bak}
:~> ls -l /tmp/myfile*
-rw-r--r-- 1 xxx users 3 Jan 19 16:43 myfile
-rw-r--r-- 1 xxx users 3 Jan 19 16:43 myfile.bak
是否允許用 “感叹号 !+ history number ” 来执行历史命令
!! : 返回并执行最近的一个历史命令
!n : 返回并执行第 n 个历史命令
:~> echo $-
himBH
:~> uptime
16:51:00 up 1137 days, 23:01, 1 user, load average: 0.29, 0.38, 0.31
:~> !!
uptime
16:51:05 up 1137 days, 23:02, 1 user, load average: 0.35, 0.39, 0.31
:~> history | grep 59
59 01/19/20 16:47 echo $-
:~> !59
echo $-
himBH
如果关掉 histexpand ,那么 !n
则无法顺利执行了。
:~> set +H
:~> echo $-
himB
:~> !59
-bash: !59: command not found
:~> !!
-bash: !!: command not found
由于 histexpand 打开的时候,“ !” 带特殊含义;
因此 histexpand 打开状态下,“ !” 不能出现在双引号中,
否则会报错 -bash: !": event not found
,具体可戳 《 Linux -bash: !": event not found 》 了解。
Linux 有一个内建的 set
命令,可以用来查看/设置/取消 shell 选项:
查看: set -o
设置: set -N 或者 set -o Nx
取消: set +N
注意这里的 “设置-” 和 “取消+” 是颠覆人类的一般认知的:设置用 -,关闭反而是用 +
具体操作效果可查看以下执行情况:
:~> echo $-
himBH
:~> set +B
:~> echo $-
himH
:~> set -B
:~> echo $-
himBH
:~> set +B
:~> echo $-
himH
~> set -o braceexpand
:~> echo $-
himBH
参考文档: Linux bash - set 指令