代码之家  ›  专栏  ›  技术社区  ›  mhost

bash变量分别捕获stderr和stdout或获取退出值[重复]

  •  17
  • mhost  · 技术社区  · 14 年前

    这个问题已经有了答案:

    我需要在bash脚本中捕获命令的输出和错误,并知道命令是否成功。

    目前,我正在捕捉这两种情况:

    output=$(mycommand 2>&1)
    

    然后我需要检查mycommand的退出值。如果它失败了,我需要对输出做一些事情,如果命令成功了,我不需要触摸输出。

    既然我要捕获输出,检查$?总是0,因为bash成功地将输出捕获到变量中。

    这是一个非常时间敏感的脚本,所以我们试图避免任何较慢的解决方案,比如输出到一个文件并重新读取它。

    如果我可以将stdout捕获到一个变量,将stderr捕获到另一个变量,这将解决我的问题,因为我可以检查错误变量是否为空。

    谢谢。

    2 回复  |  直到 8 年前
        1
  •  10
  •   paxdiablo    14 年前

    什么版本 bash 你在用吗?对输出的捕获 我的版本对返回代码的影响, 4.1.5 :

    pax> false; echo $?
    1
    pax> echo $?
    0
    pax> x=$(false 2>&1) ; echo $?
    1
    

    依靠非空的标准错误来检测错误并不总是一个好主意。许多程序不输出错误,但依赖 唯一地 在返回代码上。

        2
  •  10
  •   phs    13 年前

    只有当将输出捕获到 地方的 函数中的变量:

    $ echo $BASH_VERSION
    3.2.48(1)-release
    $ false; echo $?
    1
    $ echo $?
    0
    $ x=$(false 2>&1) ; echo $?
    1
    $ function f {
    > local x=$(false 2>&1) ; echo $?
    > }
    $ f
    0
    $ function g {
    > x=$(false 2>&1) ; echo $?
    > }
    $ g
    1
    

    请注意,只有将x捕获到局部的函数f才能表示该行为。特别是,函数g执行相同的操作,但不使用“local”关键字。

    因此,不能使用局部变量,可能在使用后“取消设置”。

    编辑 NVRAM指出,可以预先进行本地申报,以避免出现以下问题:

    $ function h {
    >   local x
    >   x=$(false 2>&1) ; echo $?
    > }
    $ h
    1