Как передать или перенаправить вывод команды curl -v?


117

По какой-то причине вывод всегда выводится на терминал, независимо от того, перенаправляю ли я его через 2>,> или |. Есть ли способ обойти это? Почему это происходит?


3
Если я это сделаю curl -v url 2>&1, ошибки будут правильно перенаправлены на стандартный вывод для меня.
Джош Ли

Ответы:


134

добавьте параметр -s(без звука), чтобы удалить индикатор выполнения, затем перенаправьте stderr на stdout, чтобы получить подробный вывод на том же fd, что и тело ответа

curl -vs google.com 2>&1 | less

3
Это работает для большинства веб-сайтов, но по какой-то причине локальный сервер на моей машине по-прежнему печатает полный вывод, даже если я делаю `2> & 1 | grep asdfasdfasdfasdfdfs` или что-то в этом роде. Полный вывод, включая заголовки, по-прежнему отображается на консоли. Есть ли другой поток, который я могу передать в grep для извлечения необходимых мне данных?
jonderry

Какую информацию вы на самом деле пытаетесь извлечь, и какую информацию вы хотите выбросить. Я понял, что ваш вопрос означает, что вы хотите, чтобы весь вывод -v направлялся на стандартный вывод.
SingleNegationElimination

Я хочу обработать некоторые файлы cookie (в основном, собирать информацию из файлов cookie и делать другие вещи). Да, я хочу, чтобы все шло на стандартный вывод, чтобы я мог обрабатывать все, что захочу, через каналы. В настоящее время часть вывода просто отображается на консоли и кажется невозможной для перенаправления, и я не уверен, почему.
jonderry

Можете ли вы опубликовать снимок экрана с выводом на экран, который вы хотите захватить? Я не знаю, какой вывод вы могли бы увидеть, но могли бы пропустить 2>&1.
SingleNegationElimination

Это тот же тип вывода, что и на любом другом веб-сайте. Единственная разница в том, что сервер работает локально. Есть ли способ для какой-либо программы печатать на консоли, но не захватывать этот текст с помощью stout / sterr?
jonderry

115

Вероятно, в вашем URL-адресе есть амперсанды. У меня тоже была эта проблема, и я понял, что мой URL-адрес был полон амперсандов (из-за переданных переменных CGI), и поэтому все отправлялось в фоновый режим странным образом и, следовательно, не перенаправлялось должным образом. Если вы заключите URL в кавычки, это исправит.


1
У меня такая же проблема. Нет необходимости в 2> & 1, поэтому я могу хранить журнал вывода и подключения отдельно. Спасибо, дорогая.
quornian 07

3
Love Stack-O ... Я нашел этот q и упоминание амперсандов в URL-адресе. Он заключил мою цитату в кавычки, и проблема решена.
Paulb

2
Цитаты помогли мне. Мне казалось, что curl выполнялся в других потоках. Большое спасибо !
vdolez

1
Пришлось поискать в Интернете пять минут, прежде чем ты спас мне вечер :)
Шаути

Господи, какая ужасная ошибка в завитке - по крайней мере, она должна выйти из строя или дать предупреждение. Ваш ответ 2012 года помог мне в 2018 году. Мне потребовалось 30 минут, чтобы решить эту проблему, пока я не нашел ваш ответ. Спасибо!
Mauvis Ledford 08

29

Приведенный выше ответ не сработал для меня, в конечном итоге сработал такой синтаксис:

curl https://${URL} &> /dev/stdout | tee -a ${LOG}

tee выводит результат на экран, но также добавляет его в мой журнал.


1
&> /dev/stdoutбыла определенно недостающая часть, спасибо
mattspain

10

Если вам нужен вывод в файл, вы можете использовать перенаправление:

curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1

Убедитесь, что вы не переворачиваете >curl-output.txtи 2>&1, это не сработает из-за поведения перенаправления bash .


3

Я обнаружил то же самое: curl сам по себе печатал в STDOUT, но не мог быть передан в другую программу.

Сначала я подумал, что решил эту проблему, используя xargs для вывода сначала вывода:

curl -s ... <url> | xargs -0 echo | ...

Но затем, как указано в комментариях, он также работает без части xargs, поэтому -s(тихий режим) является ключом к предотвращению постороннего вывода прогресса в STDOUT:

curl -s ... <url> | perl  -ne 'print $1 if /<sometag>([^<]+)/'

В приведенном выше примере извлекается простой <sometag>контент (не содержащий встроенных тегов) из XML-вывода оператора curl.


2
в ваших примерах "xargs -0 echo |" не нужно. Пока у вас есть curl -s, вы можете перенаправить вывод в другую программу.
Райан Хоррисбергер

1

Только мои 2 цента. Приведенная ниже команда должна помочь, как уже было сказано ранее.

curl -vs google.com 2>&1

Однако, если нужно получить вывод в файл,

curl -vs google.com > out.txt 2>&1

должно сработать.


1
Это не добавляет реальной ценности принятому ответу 2011 года. Во всяком случае, это может быть комментарий к этому ответу.
trincot

0

У меня сработало следующее:

Поместите свой оператор curl в сценарий с именем abc.sh

Теперь запустите:

sh abc.sh 1>stdout_output 2>stderr_output

Вы получите результаты своего завитка stdout_outputи информацию о ходе выполнения stderr_output.


0

Этот простой пример показывает, как захватить вывод curl и использовать его в сценарии bash.

test.sh

function main
{
  \curl -vs 'http://google.com'  2>&1
  # note: add -o /tmp/ignore.png if you want to ignore binary output, by saving it to a file. 
}

# capture output of curl to a variable
OUT=$(main)

# search output for something using grep.
echo
echo "$OUT" | grep 302 
echo
echo "$OUT" | grep title 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.