在管道之前返回命令的代码

时间:2014-02-28 23:29:59

标签: bash awk while-loop pipe rpm

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

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

只有当我的返回代码为0时,循环中还有一些我想做的事情(所以只有当rpm验证失败时)。 我不知道如何在循环中获取rpm --verify返回码。 $? PIPESTATUS 分配不起作用。 我想我的问题是,管道之后的命令(在我的情况下是awk)会在管道之前知道命令的返回码(在这种情况下是rpm --verify)。

2 个答案:

答案 0 :(得分:0)

这样的事情(将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}') 

请注意,awk printf中的\n是正确提供读取循环所必需的。

--- ----编辑 据悉RC需要在每一行打印。也许这会更合适:

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

- 刚看到其他解决方案。我想唯一的区别是写入文件或变量..

答案 1 :(得分:0)

试试这个:

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

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