Как передать или перенаправить вывод команды curl -v?
117
По какой-то причине вывод всегда выводится на терминал, независимо от того, перенаправляю ли я его через 2>,> или |. Есть ли способ обойти это? Почему это происходит?
Если я это сделаю curl -v url 2>&1, ошибки будут правильно перенаправлены на стандартный вывод для меня.
Джош Ли
Ответы:
134
добавьте параметр -s(без звука), чтобы удалить индикатор выполнения, затем перенаправьте stderr на stdout, чтобы получить подробный вывод на том же fd, что и тело ответа
Это работает для большинства веб-сайтов, но по какой-то причине локальный сервер на моей машине по-прежнему печатает полный вывод, даже если я делаю `2> & 1 | grep asdfasdfasdfasdfdfs` или что-то в этом роде. Полный вывод, включая заголовки, по-прежнему отображается на консоли. Есть ли другой поток, который я могу передать в grep для извлечения необходимых мне данных?
jonderry
Какую информацию вы на самом деле пытаетесь извлечь, и какую информацию вы хотите выбросить. Я понял, что ваш вопрос означает, что вы хотите, чтобы весь вывод -v направлялся на стандартный вывод.
SingleNegationElimination
Я хочу обработать некоторые файлы cookie (в основном, собирать информацию из файлов cookie и делать другие вещи). Да, я хочу, чтобы все шло на стандартный вывод, чтобы я мог обрабатывать все, что захочу, через каналы. В настоящее время часть вывода просто отображается на консоли и кажется невозможной для перенаправления, и я не уверен, почему.
jonderry
Можете ли вы опубликовать снимок экрана с выводом на экран, который вы хотите захватить? Я не знаю, какой вывод вы могли бы увидеть, но могли бы пропустить 2>&1.
SingleNegationElimination
Это тот же тип вывода, что и на любом другом веб-сайте. Единственная разница в том, что сервер работает локально. Есть ли способ для какой-либо программы печатать на консоли, но не захватывать этот текст с помощью stout / sterr?
jonderry
115
Вероятно, в вашем URL-адресе есть амперсанды. У меня тоже была эта проблема, и я понял, что мой URL-адрес был полон амперсандов (из-за переданных переменных CGI), и поэтому все отправлялось в фоновый режим странным образом и, следовательно, не перенаправлялось должным образом. Если вы заключите URL в кавычки, это исправит.
У меня такая же проблема. Нет необходимости в 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 выводит результат на экран, но также добавляет его в мой журнал.
Я обнаружил то же самое: curl сам по себе печатал в STDOUT, но не мог быть передан в другую программу.
Сначала я подумал, что решил эту проблему, используя xargs для вывода сначала вывода:
curl -s ... <url> | xargs -0 echo | ...
Но затем, как указано в комментариях, он также работает без части xargs, поэтому -s(тихий режим) является ключом к предотвращению постороннего вывода прогресса в STDOUT:
Этот простой пример показывает, как захватить вывод 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
curl -v url 2>&1
, ошибки будут правильно перенаправлены на стандартный вывод для меня.Ответы:
добавьте параметр
-s
(без звука), чтобы удалить индикатор выполнения, затем перенаправьте stderr на stdout, чтобы получить подробный вывод на том же fd, что и тело ответаисточник
2>&1
.Вероятно, в вашем URL-адресе есть амперсанды. У меня тоже была эта проблема, и я понял, что мой URL-адрес был полон амперсандов (из-за переданных переменных CGI), и поэтому все отправлялось в фоновый режим странным образом и, следовательно, не перенаправлялось должным образом. Если вы заключите URL в кавычки, это исправит.
источник
Приведенный выше ответ не сработал для меня, в конечном итоге сработал такой синтаксис:
curl https://${URL} &> /dev/stdout | tee -a ${LOG}
tee выводит результат на экран, но также добавляет его в мой журнал.
источник
&> /dev/stdout
была определенно недостающая часть, спасибоЕсли вам нужен вывод в файл, вы можете использовать перенаправление:
Убедитесь, что вы не переворачиваете
>curl-output.txt
и2>&1
, это не сработает из-за поведения перенаправления bash .источник
Я обнаружил то же самое: curl сам по себе печатал в STDOUT, но не мог быть передан в другую программу.
Сначала я подумал, что решил эту проблему, используя xargs для вывода сначала вывода:
Но затем, как указано в комментариях, он также работает без части xargs, поэтому
-s
(тихий режим) является ключом к предотвращению постороннего вывода прогресса в STDOUT:В приведенном выше примере извлекается простой
<sometag>
контент (не содержащий встроенных тегов) из XML-вывода оператора curl.источник
Только мои 2 цента. Приведенная ниже команда должна помочь, как уже было сказано ранее.
Однако, если нужно получить вывод в файл,
должно сработать.
источник
У меня сработало следующее:
Поместите свой оператор curl в сценарий с именем
abc.sh
Теперь запустите:
Вы получите результаты своего завитка
stdout_output
и информацию о ходе выполненияstderr_output
.источник
Этот простой пример показывает, как захватить вывод curl и использовать его в сценарии bash.
test.sh
источник