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

Ele*_*ito 7 error-handling bash shell dash-shell

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

set -e
trap 'echo "$0 FAILED at line ${LINENO}"' ERR
Run Code Online (Sandbox Code Playgroud)

结果发现陷阱行不适用于 Ubuntu 的默认 shell 脚本解释器 dash。如果我将 shebang 行更改#!/bin/bash为此有效但不使用#!/bin/sh. 有没有办法在不依赖 bash 的情况下完成这项工作?

顺便说一句,我从破折号得到的错误是这样的:

trap: ERR: bad trap
Run Code Online (Sandbox Code Playgroud)

ewa*_*att 10

您可以在退出时捕获并测试退出代码,如下所示:

set -e
trap '[ $? -eq 0 ] && exit 0 || echo "$0 FAILED at line ${LINENO}"' EXIT
Run Code Online (Sandbox Code Playgroud)

  • 所以它在 dash 中受支持,但 debian 使用 `--disable-lineno` 标志构建包。他们这样做是因为 autoconf 会选择 dash 作为要使用的 shell,这会导致许多其他软件包无法正确安装。https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=582952 (3认同)

org*_*hup 7

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

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

只需改变

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

或更好

#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)