八个鲜为人知的 Bash 选项

一些 Bash 选项是众所周知并且经常使用的。 例如,很多人在脚本的开头写

设置-o xtrace

用于调试,

设置-o errexit

错误退出或

设置-o errunset

如果未设置被调用的变量则退出。

但还有很多其他选择。 有时,它们在法力中的描述过于混乱,因此我在这里收集了一些最有用的内容,并附有解释。

注意:Mac 可能有较旧版本的 bash(3.x 而不是 4.x),其中并非所有这些选项都可用。 在这种情况下,请参阅 这里 или 这里.

set или shopt?

有两种方法可以设置 bash 选项:从脚本或从命令行。 您可以使用内置命令 set и shopt。 两者都改变​​了 shell 的行为,做很多相同的事情(使用不同的参数),但它们的不同之处 起源... 选项 set 是从其他 shell 的参数继承或借用的,而参数 shopt 在 bash 中创建。

如果您想查看当前选项,请运行:

$ set -o
$ shopt

要激活该选项 set 使用长语法或短语法:

$ set -o errunset
$ set -e

效果是一样的。

要禁用该选项,您需要输入加号而不是减号:

$ set +e

很长一段时间我都记不住这个语法,因为逻辑似乎是错误的(减号启用该选项,加号禁用它)。

В shopt (更符合逻辑)标志用于启用和禁用选项 -s (设定)和 -u (未设置):

$ shopt -s cdspell # <= on
$ shopt -u cdspell # <= off

更改目录

有几个选项可以帮助您使用目录。

1.CD拼写

通过此设置,bash 将开始识别拼写错误,并将您带到名称拼写错误的文件夹。

$ shopt -s cdspell
$ mkdir abcdefg
$ cd abcdeg
abcdefg
$ cd ..

我已经使用这个选项很多年了,很少(也许每年一次)它会做出一个非常奇怪的决定。 但在其他日子 cdspell 每天都可以节省时间。

2. 自动光盘

如果您不愿意接受多次输入的低效率 cd,那么您可以设置此选项,如果 X 命令不存在,则移动到 X 文件夹。

$ shopt -s autocd
$ abcdefg
$ cd ..

与自动完成功能相结合,您可以在文件夹之间快速跳转:

$ ./abc[TAB][RETURN]
cd -- ./abcdefg

只是不要命名文件夹 rm -rf * (是的,顺便说一句,这是可能的)。

3.dir展开

这是一个很酷的选项,可以通过按 Tab 来扩展环境变量:

$ shopt -s direxpand
$ ./[TAB]     # заменяется на...
$ /full/path/to/current_working_folder
$ ~/[TAB]     # заменяется на...
$ /full/path/to/home/folder
$ $HOME/[TAB] #  заменяется на...
$ /full/path/to/home/folder

干净的输出

4.检查工作

如果仍有作业在后台运行,此选项将停止注销会话。

显示未完成任务的列表,而不是退出。 如果仍想退出,则重新进入 exit.

$ shopt -s checkjobs
$ echo $$
68125             # <= ID процесса для оболочки
$ sleep 999 &
$ exit
There are running jobs.
[1]+  Running                 sleep 999 &
$ echo $$
68125             # <= ID процесса для оболочки тот же
$ exit
There are running jobs.
[1]+  Running                 sleep 999 &
$ exit
$ echo $$
$ 59316           # <= на этот раз ID процесса  изменился

替代超能力

5.环球星

这个选项给你替代超能力! 如果您输入:

$ shopt -s globstar
$ ls **

那么 shell 将递归地显示所有目录和子目录。

与...结合使用 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 让您在实际运行之前首先了解 Bash 如何解释该命令:

$ shopt -s histverify
$ echo !$          # <= По нажатию Enter команда не запускается
$ echo histverify  # <= Она сначала демонстрируется на экране,
histverify         # <= а потом запускается 

8. 诺克洛伯

再次强调,为了防止意外发生,即使用重定向操作符覆盖已经存在的文件(>)。 如果您没有备份,这可能会是一场灾难。

选项 set -С 禁止此类覆盖。 如有必要,您可以使用运算符绕过保护 >|:

$ touch afile
$ set -C
$ echo something > afile
-bash: afile: cannot overwrite existing file
$ echo something >| afile
$

来源: habr.com

添加评论