当输出通过管道传输到awk时,set -e无法捕获所有错误

时间:2018-07-13 15:27:10

标签: bash awk

我试图了解在bash脚本中通过管道传输到awk时错误捕获的工作方式。我有一个bash脚本:

#!/bin/bash
set -e 
echo "hello"
OUTPUT=`ls /root/* | awk '{print $0}'`  
echo "world"

当我以非特权用户身份运行时,输出为

hello
ls: cannot access /root/*: Permission denied
world

尽管在发生任何错误时set -e应该导致我的脚本结束这一事实。行echo "world"不应执行,因为脚本确实会产生错误。

现在,如果我将awk语句替换为grep poo,脚本将按预期方式退出。

问题:awk所做的是如何设法使bash隐藏错误?

1 个答案:

答案 0 :(得分:0)

这完全是定义;管道的输出状态是管道中最后一条命令的退出状态。

您可以在Awk中明确捕获此特定错误:

ls /root/* | awk 'BEGIN {x=1} {x=0; print $NF } END { exit x }'

这将导致Awk设置其退出状态,以反映它是否完全接收到任何输入。这类似于您发现的grep行为(如果找到任何匹配项,则报告成功)。