加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 在检查函数的退出状态和抑制输出时使用shell内置时间

发布时间:2020-12-15 18:27:17 所属栏目:安全 来源:网络整理
导读:我试图在bash脚本中执行以下操作,并且想知道是否可能: 使用时间输出命令(在本例中为mysql)的时间 取消命令的stdout输出 如果发生错误,捕获命令的stderr输出 运行后检查命令的退出状态代码 这是一个复杂的链条,我没有太多的运气让所有人一起工作.如果我停止
我试图在bash脚本中执行以下操作,并且想知道是否可能:

>使用时间输出命令(在本例中为mysql)的时间
>取消命令的stdout输出
>如果发生错误,捕获命令的stderr输出
>运行后检查命令的退出状态代码

这是一个复杂的链条,我没有太多的运气让所有人一起工作.如果我停止使用时间,我可以获得状态代码.

这是我到目前为止所做的:

# the setup
TIMEFORMAT=%R
MYSQL=mysql <options>

# execute and time a query (does more than is listed here)
function executeQuery {

  TIME=$( time ( $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null ) 2>&1 )

  # do something with $?

}

我正在使用tee将命令中的任何错误响应重定向到文件,然后将生成的stdout发送到/ dev / null.然后我将time命令的stderr重定向到stdout,它应该以$TIME结束.

现在,如果我将该行更改为:

TIME=$( time ( $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null; exit ${PIPESTATUS[0]} ) 2>&1 )

它正确地从mysql发回退出代码,但打破了time命令.

这有可能吗?我错过了什么吗?希望目标很明确.

谢谢!

bash时间是主要的PITA.它的输出是不可重定向的,没有令人讨厌的shell hacks,比如你的多级子shell. http://mywiki.wooledge.org/BashFAQ/032表明正确的答案是:
TIME = $( ( time $MYSQL "$1" 2>&1 | tee /tmp/somefile.txt > /dev/null; exit ${PIPESTATUS[0]} ) 2>&1 )

请注意,bash时间将整个管道作为参数,因此在时间调用之后放置子shell是不正确的.

这是用测试

TIME = $( ( time ls /asdfasfdsfs 2>&1 | tee asdf 2>&1 >/dev/null ; exit ${PIPESTATUS[0]} ) 2>&1 );
echo $?;
echo $TIME

哪个给了我

2
real 0m0.003s user 0m0.004s sys 0m0.004s

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读