2016-04-21 4 views
4

Я пытаюсь сохранить заголовки (из stderr) отклика в переменной и передать тело (от stdout) в grep.Как захватить stderr в переменную и stdout трубы через

Вот моя текущая попытка:

{ 
    HEADERS=$(curl -vs $URL 2>&1 1>&3-) 
    echo "$HEADERS" 
} 3>&1 | grep "regex" >> filename 
echo "$HEADERS" 

При запуске сценария с bash -x script.sh я вижу + HEADERS='...' с ожидаемым выходом, но я не могу получить доступ к ним с любого $HEADERS ни "$HEADERS" внутри и снаружи инлайн группы.

Кузов доставлен, как и ожидалось.

+0

Вы хотите, чтобы выход 'grep' находился на терминале или где-то еще? – anishsane

+2

'curl -vs - $ URL 2> & 1 1> & 3-' to 'curl -vs $ URL 2> & 1 1> & 3 -' – han058

+0

Любая причина не просто устанавливать заголовок как переменную, а grep вместо этой переменной сложная труба? – 123

ответ

2

Как anubhava правильно diagnosed, проблема в том, что вы устанавливаете HEADERS в подпроцесс, а не в основной процесс вашей оболочки.

Вы можете использовать Bash-process substitution, чтобы избежать этой проблемы, без использования временных файлов, которые должны быть очищены в случае оболочки прерывается:

HEADERS="" 
{ HEADERS=$(curl -vs "$URL" 2>&1 1>&3-); } 3> >(grep "regex" > file) 
echo "$HEADERS" 

Суб-процесс Grep скрыт в процессе замена. Требуется пространство между 3> и >(…).

2

Вы теряете HEADERS переменную из-за использования труб, которые вилки и управляют вашими командами в подчиненной оболочке, а родительская оболочка не видит переменную, созданную в дочерних оболочках.

Вы можете сделать это через временный файл:

{ f=$(mktemp /tmp/curl.XXXXXX); curl -vs "$URL" 2>"$f" | 
grep 'regex' >> filename; HEADERS="$(<$f)"; trap 'rm -f "$f"' EXIT;} 

Теперь HEADERS переменным будет заполняться в самой родительской оболочке путем чтения временного файла, созданное с помощью mktemp.

+1

Было бы неплохо показать 'rm -f '$ f" 'после присвоения' HEADERS'? Как насчет прерываний, ловушек и очистки файла? –

+0

Спасибо, я добавил 'trap' для очистки временного файла. – anubhava

+0

Спасибо за эту версию, которая также работает. Я принял решение @ JonathanLeffler, поскольку оно позволяет избежать временных файлов. –