2014-02-28 42 views
0

我想验证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 --verify返回码。这个$?PIPESTATUS分配不起作用。 我想我的问题是,pipe(awk在我的情况)之后的命令是否会知道管道之前的命令的返回码(rpm - 在这种情况下为verify)。

+0

不,awk没有得到返回码,因为它在'rpm'完成之前运行。返回码仅返回到调用进程,即shell。 – Barmar

+0

从http://mywiki.wooledge.org/ProcessSubstitution:无法从创建进程的shell中获取进程替换命令的退出代码substitution_ – Barmar

+1

我认为您必须编写'rpm'' s输出到一个临时文件来解决这个问题。 – Barmar

回答

0

试试这个:

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

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

+0

适合我。由于我正在运行循环以对验证失败的rpms执行一些后处理,因此我只是将&&更改为||。非常感谢 – ac1982

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") 

- 只看到了其他的解决办法。我想唯一的区别是写入文件或变量..

+0

不起作用。因为只有在打印完所有行后才会打印返回码。要使while循环工作,需要在每行的末尾打印。 'S.5 .... T c /etc/apache2/default-server.conf S.5 .... T c /etc/apache2/httpd.conf S.5 .... T c /etc/apache2/listen.conf S.5 .... T c /etc/apache2/mod_log_config.conf S.5 .... T c /etc/apache2/mod_mime-defaults.conf S.5 .... T /etc/apache2/server-tuning.conf 1' – ac1982

+0

@ ac1982:添加了一个自适应。看看有没有更进一步.. – Scrutinizer