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

管道前命令的返回代码

  •  0
  • ac1982  · 技术社区  · 11 年前

    我正在尝试验证rpms,在while循环中分配一些变量,并在循环中进行更多处理。

        while read fstatus fname rc
        do
           echo "RC : ${lrc}" 
        done < <(rpm --verify apache2 | awk -vrc=$? '{printf "%s %s %s", $1, $NF, rc}')
    

    只有当我的返回代码为no 0时(所以只有当rpm验证失败时),我才想在循环中做一些事情。 我不知道如何在循环中获取rpm——验证返回代码。这个 $? 管道状态 作业不起作用。 我想我的问题是,管道后面的命令(在我的例子中是awk)会知道管道前面的命令的返回代码吗(在这种情况下是rpm——verify)。

    2 回复  |  直到 11 年前
        1
  •  0
  •   Eran Ben-Natan    11 年前

    试试看:

    rpm --verify apache2 > tempfile && awk -vrc=$? '{printf "%s %s %s", $1, $NF, rc}' tempfile
    

    这样,只有当rpm-verify成功时,才会执行awk。如果失败,awk将不会运行,您将在$?中获得它的状态?。

        2
  •  0
  •   Scrutinizer    11 年前

    像这样(以字符串形式传递RC值)怎么样

    while read fstatus fname rc
    do
      echo "RC : ${lrc}" 
    done < <( { v=$(rpm --verify apache2); printf "%s\n" "$v $?" ;} | awk '{printf "%s %s %s\n", $1, $(NF-1), $NF}') 
    

    注意 \n 在awk中,需要printf来正确地馈送读取循环。

    ---编辑---- 了解到RC需要打印在每一行上。也许这样更合适:

    done < <( v=$(rpm --verify apache2) ; awk -v rc=$? '{printf "%s %s %s\n", $1, $NF, rc}' <<< "$v" )
    

    -- 只是看到了另一个解决方案。我想唯一的区别是写入文件或变量。。