一些Bash选项是众所周知的,并且经常使用。 例如,许多脚本的开头
设置-o xtrace
用于调试,
设置-o errexit
误退出或
设置-o errunset
如果未设置被调用变量,则退出。
但是还有许多其他选择。 有时,它们在芒格中描述得太混乱了,因此我在这里收集了一些最有用的信息,并作了解释。
注意:Mac可能具有较旧的bash版本(3.x,而不是4.x),其中不是所有这些选项都可用。 在这种情况下,请查看此处或此处 。set
还是shopt
?
有两种设置bash参数的方法:从脚本或从命令行。 您可以使用内置的
set
和
shopt
。 两者都改变了外壳的行为,做了很多相同的事情(使用不同的参数),并且它们的
起源也不同。
set
参数是从其他Shell的参数继承或借用的,而
shopt
参数
shopt
在bash
shopt
创建的。
如果要查看当前选项,请运行:
$ set -o $ shopt
要激活
set
的选项,使用长或短语法:
$ set -o errunset $ set -e
效果是一样的。
要禁用该选项,您需要加上一个加号而不是一个减号:
$ set +e
很长一段时间我都不记得这种语法,因为逻辑似乎是错误的(减号打开了选项,加号关闭了)。
shopt
使用(更具逻辑性)
-s
(设置)和
-u
(未设置)标志来启用和禁用选项:
$ shopt -s cdspell
目录更改
有几个选项可帮助您使用目录。
1. cdspell
使用此设置,bash将开始理解拼写错误,并将您转移到您输入错误名称的文件夹。
$ shopt -s cdspell $ mkdir abcdefg $ cd abcdeg abcdefg $ cd ..
我使用此选项已经很多年了,很少(也许一年一次)做出一个非常奇怪的决定。 但是在其他日子里,
cdspell
可以节省时间。
2. autocd
如果您还没有准备好忍受重复的
cd
输入的低效率,那么可以设置该选项以在X命令不存在的情况下移至X文件夹。
$ shopt -s autocd $ abcdefg $ cd ..
结合自动完成功能,您可以快速跳转到以下文件夹:
$ ./abc[TAB][RETURN] cd -- ./abcdefg
只是不要
rm -rf *
文件夹
rm -rf *
(是的,这是可能的)。
3. direxpand
这是一个很酷的选项,可以通过按Tab来扩展环境变量:
$ shopt -s direxpand $ ./[TAB]
清洁出口
4.检查工作
如果作业仍在后台运行,则此选项将停止从会话中退出。
显示未完成任务的列表,而不是退出。 如果仍要退出,请再次输入
exit
。
$ shopt -s checkjobs $ echo $$ 68125
替代能力
5.全球星
此选项为您提供超常替代能力! 如果输入:
$ shopt -s globstar $ ls **
然后Shell将递归显示所有目录和子目录。
与
direxpand
结合使用
direxpand
您可以快速查看层次结构下面的所有内容:
$ shopt -s direxpand $ ls **[TAB][TAB] Display all 2033 possibilities? (y or n)
6.extglob
此选项激活更常与正则表达式关联的函数。 有时这非常有用:
$ shopt -s extglob $ touch afile bfile cfile $ ls afile bfile cfile $ ls ?(a*|b*) afile bfile $ ls !(a*|b*) cfile
在此,将图案放在括号中,并用竖线分隔。 以下是可用的运算符:
? =匹配给定模式的零或一次出现
! =显示与给定模式不匹配的所有内容
* =零次或多次
+ =一次或多次
@ =恰好发生一次
事故保护
7.组织验证
首先,使用缩写历史中的快速启动命令可能会有点吓人
!!
和
!$
。
histverify
选项使
histverify
可以在启动之前先了解Bash如何解释该命令:
$ shopt -s histverify $ echo !$
8.夜猫子
同样,为了防止发生意外,即避免使用重定向运算符(
>
)覆盖已存在的文件。 如果没有备份,这可能是灾难。
set -
选项禁止此类覆盖。 如有必要,可以使用运算符
>|
绕过保护
>|
:
$ touch afile $ set -C $ echo something > afile -bash: afile: cannot overwrite existing file $ echo something >| afile $