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

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

  •  0
  • irritable_phd_syndrome  · 技术社区  · 6 年前

    我试图理解错误捕捉在管道传输到时是如何工作的 awk

    #!/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"

    现在如果我替换 grep poo ,脚本按预期退出。

    问题:什么是

    1 回复  |  直到 6 年前
        1
  •  1
  •   tripleee    6 年前

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

    您可以在Awk中显式捕获此特定错误:

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

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