die() {
local c=${1:--1} m=${2:-'Died'}
echo "$m at ${BASH_SOURCE[1]}:${FUNCNAME[1]} line ${BASH_LINENO[0]} (exit $c)" >&2
exit $c
}
call() { local rc; set -x; "$@"; rc=$?; { set +x; } 2>/dev/null; return $rc; }
call "$opt_rhapsodycl" -f $rclfile || die $? 'Rhapsody license server not reachable'
例如,如果失败,则会打印如下内容:
+ path/to/RhapsodyCL.exe -f configuration.rcl
+ rc=127
Rhapsody license server not reachable at ./Build:main line 167 (exit 127)
7条答案
按热度按时间pn9klfpd1#
我也遇到了同样的问题,我找到了一个不使用子shell的解决方案:
uqdfh47h2#
您可以使用子shell。退出子shell时,
x
的设置将丢失:zzwlnbp83#
最近,当我对此感到恼火时,我想出了一个解决方案:
这允许您启用和禁用xtrace,如下所示,我将记录参数是如何分配给变量的:
您会得到如下输出:
iq0todco4#
基于@user108471简化版本的解决方案如何:
zdwk9cvp5#
这是一些想法的组合,可以包含代码块并保留退出状态。
执行时:
vecaoik16#
这是另一个例子。通常你只想在你的脚本中跟踪一个特定的命令。那么为什么不写一个函数来完成这个任务呢?
我们可以通过返回(并跟踪)被调用命令的退出代码来进一步改进这一点:
下面是一个真实的的示例,它调用Rhapsody CLI程序,从带有命令行选项的. rcl文件生成源代码:
例如,如果失败,则会打印如下内容:
或者在成功的情况下,脚本继续。使用这两个函数(
call
和die
),我们可以编写非常紧凑和可读的单行程序,同时也可以产生很好的跟踪输出。bybem2ql7#
与此问题有些相关的是,如何才能使(逻辑)注解也显示在跟踪的输出中,以便解释脚本的命令正在执行什么高级操作。
如果您不介意最小的开销,我通常的做法是:
一些脚本.sh
输出示例
当然,您也可以用单引号或双引号将**:**内置函数的参数括起来,使用双引号(或不使用引号)的好处是,在输出过程中还会发生变量扩展(以及其他副作用)。
然后,可以将此方法用作仅跟踪内联详细消息工具,使您能够在常规跟踪输出中注入其他调试跟踪消息,这些消息在禁用跟踪时不会输出。