前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell | 开启debug模式

shell | 开启debug模式

作者头像
Amadeus
发布2022-10-25 17:02:39
1.2K0
发布2022-10-25 17:02:39
举报
文章被收录于专栏:linux技术

前言#

shell脚本是没有debug模式的,不过可以通过 set 指令实现简单的debug功能

shell脚本中默认每条指令都会从上到下依次执行,但是当某行指令报错时,我们大多数情况下是不希望继续执行后续指令的

这时可以使用shell脚本中 set 指令的四个参数:-e、-u、-x、-o pipefail

命令报错即返回值($?)不为0

set -e#

set -e 选项可以在脚本出现异常的时候立即退出,后续命令不再执行,相当于打上了一个断点

if 判断条件里出现异常也会直接退出,如果不希望退出可以在判断语句后面加上 || true 来阻止退出

before#

脚本内容

foo是一个不存在的命令,用于模拟命令报错

代码语言:javascript
复制
#!/bin/bash

foo
echo "hello"

执行结果

代码语言:javascript
复制
./test.sh: line 3: foo: command not found
hello

after#

脚本内容

代码语言:javascript
复制
#!/bin/bash

set -e

foo
echo "hello"

执行结果

代码语言:javascript
复制
./test.sh: line 5: foo: command not found

阻止立即退出的例子#

代码语言:javascript
复制
#!/bin/bash

set -e

foo || true
echo "hello"
代码语言:javascript
复制
./test.sh: line 5: foo: command not found
hello

set -o pipefail#

默认情况下 bash 只会检查管道(pipelie)操作的最后一个命令的返回值,即最后一个命令返回值为 0 则判断整条管道语句是正确的

如下

image-20220629145221486
image-20220629145221486

set -o pipefail 的作用就是管道中只要有一个命令失败,则整个管道视为失败

before#

代码语言:javascript
复制
#!/bin/bash

set -e

foo | echo "a"
echo "hello"
代码语言:javascript
复制
./test.sh: line 5: foo: command not found
a
hello

after#

代码语言:javascript
复制
#!/bin/bash

set -eo pipefail

foo | echo "a"
echo "hello"
代码语言:javascript
复制
./test.sh: line 5: foo: command not found
a

set -u#

set -u 的作用是将所有未定义的变量视为错误,默认情况下 bash 会将未定义的变量视为空

before#

代码语言:javascript
复制
#!/bin/bash

set -eo pipefail

echo $a
echo "hello"
代码语言:javascript
复制
hello

after#

代码语言:javascript
复制
#!/bin/bash

set -euo pipefail

echo $a
echo "hello"
代码语言:javascript
复制
./test.sh: line 5: a: unbound variable

set -x#

set -x 可以让 bash 把每个命令在执行前先打印出来,好处显而易见,可以快速方便的找到出问题的脚本位置,坏处就是 bash 的 log 会格外的乱

另外,它在打印的时候会先把变量解析出来

纵然 log 可能会乱一些,但也比debug的时候掉头发强

代码语言:javascript
复制
#!/bin/bash

set -euox pipefail

a=2
echo $a
echo "hello"
代码语言:javascript
复制
+ a=2
+ echo 2   # 这里已经将变量 a 解析为 2 了
2
+ echo hello
hello

参考#

https://zhuanlan.zhihu.com/p/107135290

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言#
  • set -e#
    • before#
      • after#
        • 阻止立即退出的例子#
        • set -o pipefail#
          • before#
            • after#
            • set -u#
              • before#
                • after#
                • set -x#
                • 参考#
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档