抑制Bash中readarray命令中的错误

时间:2018-11-09 21:00:57

标签: bash if-statement jq

我正在解析AWS策略文档,并试图将此命令中的错误发送到/ dev / null,以便用户看不到它们。

这是我的代码:

readarray -t aws_policy_effects < \
    <( if aws iam get-policy-version --policy-arn "$aws_policy_arn" \
              --version-id "$aws_policy_version_id"  --profile="$aws_key" 2> /dev/null | \
          jq -r '.PolicyVersion.Document.Statement[].Effect'
       then
           true
       else
           aws iam get-policy-version --policy-arn "$aws_policy_arn" \
                   --version-id "$aws_policy_version_id" --profile="$aws_key" | \
               jq -r '.PolicyVersion.Document.Statement.Effect'
          fi)

我正在使用'if'语句,以便根据我们正在阅读的aws策略使用正确的jq查询。

我会收到此错误:

jq: error (at <stdin>:22): Cannot index string with string "Effect"

因为此命令始终作为if(如果没有列出AWS策略文档的语句)的第一个条件运行:

++ jq -r '.PolicyVersion.Document.Statement[].Effect'
++ aws iam get-policy-version --policy-arn arn:aws:iam::123456789101:policy/IP_RESTRICTION --version-id v11 --profile=company-lab

为什么不通过将错误发送到/ dev / null来掩埋错误?如何使用此if语句获取不打印到屏幕的错误?

2 个答案:

答案 0 :(得分:2)

  

我正在使用'if'语句,以便根据我们正在阅读的aws策略使用正确的jq查询。

但是jq告诉您jq查询并不总是有效的。因此,一种选择是使您的jq查询更可靠,例如通过使用后缀?(例如.Effect?)或测试输入的类型,等等。

答案 1 :(得分:0)

我没有重定向jq的标准错误,只有aws的标准错误。将2> /dev/null放在jq命令的末尾即可。