Linux himBH 和 set 命令




一、 $- 和 himBH


:~> 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 每一项,具体表示什么意思呢?




二、 himBH 简析


1、h - hashall


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 学习笔记 》 了解。


2、i - interactive-comments


配置在交互 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 的区别 》 释疑。


3、m - monitor


配置是否打开控制 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

4、B - braceexpand


关于括号使用的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

5、H - histexpand


是否允許用 “感叹号 !+ 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 》 了解。




三、set 命令


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 指令

发布了37 篇原创文章 · 获赞 24 · 访问量 3070

猜你喜欢

转载自blog.csdn.net/weixin_44648216/article/details/104062992
今日推荐