本文介绍: 本文介绍Bash中,它们可以帮助你写出更容易维护也更安全脚本。这也是Bash脚本的终极调试手段,希望你以后在自己的脚本中加上这么一行,头顶也能少秃一点今天打开一个脚本《JetsonNano使能SPI总线》:https://github.com/rtnet/JetsonNano_DT_SPI发现添加一个seteu参数有点好奇,便百度记录了一下以后应该用到linux使用脚本的频率还是挺高的。

本文介绍Bash中 set -euxo pipefail 大佬的文章学习膜拜体验,它们可以帮助你写出更容易维护也更安全的脚本。这也是Bash脚本的终极调试手段,希望你以后在自己的脚本中加上这么一行,头顶也能少秃一点 

 今天打开一个脚本《JetsonNano使能SPI总线》:https://github.com/rtnet/JetsonNano_DT_SPI发现添加一个set -eu参数有点好奇,便百度记录了一下以后应该用到linux使用脚本的频率还是挺高的。

set -e

set -e 选项可以让你的脚本在出现异常时马上退出,后续命令不再执行默认情况下Shell脚本不会因为错误结束执行,但大多数情况是,我们希望出现异常时就不要再往下走了。特殊情况下假如你的if判断条件里会出现异常,这时脚本也会直接退出,但可能这并不是你期望的情况,这时你可以判断语句后加上 || true 来阻止退出

举例

#!/bin/bash

# 'foo' is a non-existing command
foo
echo "bar"

# output
# ------
# line 4: foo: command not found
# bar

#!/bin/bash
set -e

# 'foo' is a non-existing command
foo
echo "bar"

# output
# ------
# line 5: foo: command not found

 

 阻止立刻退出例子

#!/bin/bash
set -e

# 'foo' is a non-existing command
foo || true
echo "bar"

# output
# ------
# line 5: foo: command not found
# bar

set -o pipefail

默认情况下Bash只会检查管道pipeline操作最后一个命令返回值假如右边命令成功那么它就认为这个语句问题。这个行为其实是很不安全的,所以就有了set -o pipefail。这个特别的选项表示管道连接命令中,只要有任何一个命令失败返回值非0),则整个管道操作被视为失败。只有管道中所有命令都成功执行了这个管道才算成功执行。

#!/bin/bash
set -e

# 'foo' is a non-existing command
foo | echo "a"
echo "bar"

# output
# ------
# a
# line 5: foo: command not found
# bar

 上面的情况就是虽然加了-e,但是最后一个命令的返回值正确的所以打印继续执行了。

#!/bin/bash
set -eo pipefail

# 'foo' is a non-existing command
foo | echo "a"
echo "bar"

# output
# ------
# a
# line 5: foo: command not found

set -u

set -u 比较容易理解,Bash会把所有未定义变量视为错误默认情况下Bash会将未定义的变量为空,不会报错,这也是很多坑的来源。也许由于变量名的细微差别让你查半天最后骂骂咧咧。

#!/bin/bash
set -eo pipefail

echo $a
echo "bar"

# output
# ------
#
# bar

#!/bin/bash
set -euo pipefail

echo $a
echo "bar"

# output
# ------
# line 5: a: unbound variable

set -x

set -x 可以让Bash把每个命令在执行前先打印出来,你可以认为这就是Bash的Debug开关。它的好处当然显而易见,方便你快速找到有问题的脚本位置,但是也坏处也有吧,就是Bash的log会格外的乱。另外,它在打印命令前会把变量解析出来,所以你可以知道当前执行的语句的变量值是什么。纵然log可能会乱一些,总比头发乱一些好,所以建议还是打开这个开关

#!/bin/bash
set -euxo pipefail

a=5
echo $a
echo "bar"

# output
# ------
# + a=5
# + echo 5
# 5
# + echo bar
# bar

 学习大佬笔记以后我决定以后自己的脚本都加这个,大佬要是介意我复制粘贴的话记得联系我删除

原文地址:https://blog.csdn.net/weixin_46151178/article/details/128832786

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_25408.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注