posix shell:stdout to file,exitcode到变量,stderr的最后一行到另一个变量

时间:2013-05-24 06:13:44

标签: shell posix stdout stderr exit-code

我在POSIX shell(而不是bash)中实现了以下内容:

fail.sh:

#!/bin/sh
echo something useful
echo warning 1 >&2
echo warning 2 >&2
echo an error message >&2
exit 100

该命令打印出我要在stdout上使用的内容,stderr上的一些警告以及stderr上的错误消息以及退出代码100失败之前。

success.sh:

#!/bin/sh
echo something useful
echo warning 1 >&2
echo warning 2 >&2
exit 0

此命令将某些内容输出到stdout,并向stderr输出一些警告,但是使用退出代码0成功完成。

test.sh:

#!/bin/sh -e

script=$1
rm -f success
msg=$({ $script > useful; touch success; } 2>&1 | tail -1;)

if [ -f success ]; then
        echo success
else    
        echo failure
        echo last error was: $msg
fi

在这个脚本中,我想运行这两个脚本中的任何一个并提供以下功能:

  • 必须将脚本的输出重定向到文件
  • 必须将stderr的最后一行保存到变量中,以便我可以稍后打印最后一行,以防命令没有成功退出
  • 我想通过检查退出状态
  • 来检测命令是否成功退出

我的脚本test.sh实现了所有这一切,但它使用了外部文件。由于我使用-etouch只会在成功执行$script时执行。我可以在没有这种技术的情况下捕获$script的退出代码吗?

脚本必须用POSIX shell编写,并且必须使用-e

1 个答案:

答案 0 :(得分:1)

#!/bin/sh -e

script=$1
if msg=$($script 2>&1 >useful); then
    echo success
else
    echo failure
    msg=$(echo "$msg" | tail -1)
    echo last error was: $msg
fi