我试图了解在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隐藏错误?
答案 0 :(得分:0)
这完全是定义;管道的输出状态是管道中最后一条命令的退出状态。
您可以在Awk中明确捕获此特定错误:
ls /root/* | awk 'BEGIN {x=1} {x=0; print $NF } END { exit x }'
这将导致Awk设置其退出状态,以反映它是否完全接收到任何输入。这类似于您发现的grep
行为(如果找到任何匹配项,则报告成功)。