在bash中分配变量和重定向

时间:2014-08-19 20:16:35

标签: bash curl

我正在对Web服务进行临时性能分析,该服务似乎保持某种状态并且变慢和变慢,直到最终事情开始超时。我有一个简单的脚本会暴露这种行为:

while true
do
    RESPONSE_CODE=$( curl --config curl.config )

    if [ "$RESPONSE_CODE" -eq "200" ]; then
        echo SUCCESS
    else
        echo FAILURE
    fi
done

除了一些标题,Cookie,发布数据,网址等,curl.config特别有以下几行:

silent
output = /dev/null
write-out = "%{http_code}"

因此curl的唯一输出应该是HTTP状态代码。

这很好用。我想做的是这样的事情:

{ time -p RESPONSE_CODE=$(curl --config curl.config) ; } 2>&1 | awk '/real/{print $2;}'

获取这些查询实际需要多长时间的运行打印输出,同时仍然保存curl的输出以供我的测试使用。但这不起作用。

如何从curl捕获http状态并获取time的输出以便我可以处理它们?

2 个答案:

答案 0 :(得分:1)

正如所写:

RESPONSE_CODE = $( curl --config curl.config )

你在作业周围有空格,它在shell中不起作用(它试图以RESPONSE_CODE作为第一个参数执行命令=,等等。你需要:

RESPONSE_CODE=$( curl --config curl.config )

time内置很难重定向。由于您需要HTTP状态和实时,因此您必须执行某些操作才能捕获这两个值。一种可能性是:

set -- $( (time -p -- curl --config curl.config ) 2>&1 |
         awk '/real/{print $2} /^[0-9]+$/{print}')

将设置1美元和2美元。另一个是数组赋值:

data=( $( (time -p -- curl --config curl.config ) 2>&1 |
         awk '/real/{print $2} /^[0-9]+$/{print}') )

HTTP响应代码应该出现在时间之前。

(使用sh -c 'echo 200; sleep 1'代替curl --config curl.config进行测试。)

答案 1 :(得分:1)

如果Curl的响应只有一行,这应该有效:

#!/bin/bash
RESPONSE_CODE=''
TIME=''
while read -r TYPE DATA; do
    case "$TYPE" in
    curl)
        RESPONSE_CODE=$DATA
        ;;
    real)
        TIME=$DATA
        ;;
    esac
done < <(exec 2>&1; time -p R=$(curl --config curl.config); echo "curl $R") 

或者使用关联数组:

#!/bin/bash
declare -A RESPONSE
while read -r TYPE DATA; do
    RESPONSE[$TYPE]=$DATA
done < <(exec 2>&1; time -p R=$(curl ...); echo "code $R") 
echo "${RESPONSE[code] ${RESPONSE[real]}"