在shell脚本中可移植地捕获ERR

时间:2015-07-09 09:22:59

标签: bash shell error-handling dash-shell

我正在尝试编写一个shell脚本,在命令失败时中止并显示有问题的行号。

set -e
trap 'echo "$0 FAILED at line ${LINENO}"' ERR

原来,陷阱行不能与Ubuntu的默认shell脚本解释器破折号一起使用。如果我将shebang行更改为#!/bin/bash,则可以使用#!/bin/sh。有没有办法让这项工作不依赖于bash存在?

顺便说一下,我从破折号得到的错误就是:

trap: ERR: bad trap

2 个答案:

答案 0 :(得分:2)

  

根据互联网上的各种消息来源,ERR不是标准的   所有并且只有Korn Shell支持 - 它似乎发明了它 -   和Bash,似乎采用它。   https://github.com/bmizerany/roundup/issues/25#issuecomment-10978764

我会选择简单的解决方案。

只需更改

#!/bin/sh

#!/bin/bash

或更好

#!/usr/bin/env bash

答案 1 :(得分:1)

您可以在退出时设置陷阱并测试退出代码,如下所示:

set -e
trap '[ $? -eq 0 ] && exit 0 || echo "$0 FAILED at line ${LINENO}"' EXIT