Як я трубу чи перенаправляю висновок 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, щоб витягти потрібні мені дані?
веселість

Яку інформацію ви насправді намагаєтеся витягти та яку інформацію ви хочете викинути. Я зрозумів, що ваше запитання означає, що ви хочете, щоб весь вихід -v був спрямований на stdout.
SingleNegationElimination

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

Чи можете ви розмістити знімок екрана, який відображається на екрані, який ви бажаєте зробити? Я не знаю, якого виду ви могли б бачити, що його, можливо, не вдасться пропустити 2>&1.
SingleNegationElimination

Це просто той же тип виводу, що і для будь-якого іншого веб-сайту. Єдина відмінність - сервер працює локально. Чи існує якась можливість для будь-якої програми надрукувати на консолі, але не повинен цей текст захоплювати stout / sterr?
веселість

115

Можливо, у вашій URL-адресі розміщено розширення. У мене була і ця проблема, і я зрозумів, що моя URL-адреса повна амперсандів (від передаваних змінних CGI), і тому все надходило на задній план дивним чином і, таким чином, не перенаправлялось належним чином. Якщо ви поставите лапки навколо URL-адреси, це виправить.


1
У мене була така ж проблема. Немає потреби у 2> і 1, тому я можу тримати окремо журнал виводу та з'єднання. Дякуємо дорожній дорозі.
курінь

3
Love Stack-O ... Я знайшов це питання q та згадку про амперсанди в URL-адресі. Це ставить цитати навколо моїх, і проблема вирішується.
Павло

2
Цитати зробили для мене трюк. Я відчував, що завиток виконується в інших нитках. Дуже дякую !
vdolez

1
Довелося шукати в Інтернеті за п’ять хвилин, перш ніж ви врятували мій вечір :)
Shautieh

Ісусе, яка жахлива помилка в кучері - принаймні, вона повинна вийти з ладу або попередити. Ваша відповідь 2012 року допомогла мені у 2018 році. Вирішив це 30 хвилин, поки я не натрапив на вашу відповідь. Дякую!
Mauvis Ledford

29

Відповідь вище для мене не спрацювала. Зрештою, був цей синтаксис:

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

tee ставить вихід на екран, але також додає його до мого журналу.


1
&> /dev/stdoutбула точно відсутня частина, дякую
mattspain


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

Для мене працювало наступне:

Покладіть свою заяву на вигин у сценарій з назвою 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.