-1

我有一个具有 Perl 风格的“或死”的 Bash 函数。例如,

#!/bin/bash
func1 () {
    local val
    val=`cat foobar` || exit 7
    echo "func1: cat returns $?"
}

myval=`func1`
echo "Line X should not be reached (retn = $? val = $myval)"
myval=$(func1)
echo "Line Y should not be reached (retn = $? val = $myval)"
func1
echo "Line Z should not be reached (retn = $?)"

直接调用函数让我利用exit. 但是,如果该函数返回一个我想使用的值,则命令替换不适用于exit. 即exit只存入返回值$?,执行下一行。

使用调试选项运行-x似乎意味着命令替换类似于子shell,因为 bash 为它输出更深的嵌套。因此,exit不适用于主脚本。

样本输出:

cat: foobar: No such file or directory
Line X should not be reached (retn = 7 val = )
cat: foobar: No such file or directory
Line Y should not be reached (retn = 7 val = )
cat: foobar: No such file or directory

有没有办法调用 func1 并使用它的输出(在变量、循环、if 等中),同时仍然利用短路exit

4

1 回答 1

0

您可以使用这个包含 SIGHUP 信号处理程序的简单代码,它可以按照您的意愿完美运行 :)

hndlHUP () {
    exit 7
}
func1 () {
    local val
    val=$(cat foobar) || kill -SIGHUP $$
    echo "func1: cat returns $?"
}

trap hndlHUP SIGHUP

myval=`func1`
echo "Line X should not be reached (retn = $? val = $myval)"
myval=$(func1)
echo "Line Y should not be reached (retn = $? val = $myval)"
func1
echo "Line Z should not be reached (retn = $?)"
于 2014-11-27T13:51:10.093 回答