Какая разница -v многословная в curl?

Rishi спросил: 28 марта 2018 в 03:59 в: linux

Я сделал эту утилиту (часть кода утилиты)

#!/bin/bash
url_prefix='https://www.javatpoint.com/'
url_suffix='java-tutorial'  curl -v $url_prefix$url_suffix | grep -m 1 '>next' | cut -d '"' -f 4 >temp.html

Если я удаляю -v из curl commnad, он начинает говорить, что не удалось написать тело. Я не могу понять, почему это происходит. Полный код доступен по адресу https://github.com/RishiPrakash/JavatpointAsPdf

2 ответа

Charles Duffy ответил: 28 марта 2018 в 07:29

curl -v не вызывает и не подавляет вашу ошибку, но ошибка может быть потеряна в других сообщениях журнала, которые -v записывает.

curl -v only определяет, будет ли подробное ведение журнала записываться в stderr; это никак не влияет на ваш конвейер.


Ошибка на самом деле вызвана curl | grep -m 1.

Чтобы объяснить ошибку, тогда:

grep -m 1 указывает grep выйти после первого совпадения.

Это означает, что все последующие записи по curl в FIFO, прочитанные grep, будут вызвать ошибку EPIPE, так как программа на другом конце конвейера больше не читает. Следовательно, curl не может написать остальную часть тела, поэтому вы получите ошибку, о которой идет речь.

Однако , так как остальная часть вашего конвейера не фактически использовать любое из этого содержимого тела, это ожидаемо и безопасно.


Если вы хотите подавить эту ошибку, разрешите curl записать весь вывод, даже если grep это не нужно, вы можете сделать это достаточно легко:

content=$(curl -v "$url_prefix$url_suffix")
printf '%s\n' "$content" | grep -m 1 '>next' | ...

Подстановка команд считывает весь вывод curl, поэтому ошибка не возникает.

ruakh ответил: 28 марта 2018 в 04:32
Оператор спрашивает, почему он получает эту ошибку, только когда удаляет -v; но ваш ответ, кажется, будет одинаково применим как с -v, так и без него?
Charles Duffy ответил: 28 марта 2018 в 04:39
@ruakh, имейте в виду, что весь дополнительный вывод curl -v идет только в stderr. Таким образом, он вообще не взаимодействует с конвейером, поэтому единственное разумное различие между ними заключается только в том, отображается ли ошибка пользователю , а не в том, происходит ли она.
Charles Duffy ответил: 28 марта 2018 в 04:45
@ruakh, ... вы можете легко его повторить - сравните curl -v https://www.javatpoint.com/java-tutorial | tee /dev/null | head -n 1 с tee и без него.
ruakh ответил: 28 марта 2018 в 06:36
Я не говорю, что этот ответ неправильный, я говорю, что он не совсем отвечает на вопрос ОП. Возможно, проблема в том, что вопрос некорректен - ОП считает, что удаление -v вызывает ошибку, но на самом деле [что-то еще] - но в этом случае я думаю, что вы должны хотя бы указать, что в ответ.
Charles Duffy ответил: 28 марта 2018 в 03:05
@Rishi, -v не изменяет поведение этой команды в любом случае - подробные журналы отправляются в stderr, поэтому они не записываются в content, не передаются в grep , так далее.
crack_iT ответил: 28 марта 2018 в 04:24

Согласно man-странице curl https://curl.haxx.se/docs/manpage.html, используя verbose, вы можете увидеть больше отладочной информации об операции curl. это "дополнительная информация", которая отсутствует, если вы заметили, используя подробный режим (-v)

Charles Duffy ответил: 28 марта 2018 в 04:36
"Выполнение дальнейших операций с этой" дополнительной информацией "верно только в том случае, если эта дополнительная информация записана в стандартный вывод. Стандарт POSIX определяет, что stderr должен использоваться для "диагностического содержимого", и вывод, добавленный -v, определенно таков.
Charles Duffy ответил: 28 марта 2018 в 04:38
... более того, тестирование на практике , curl -v http://example.com/ | md5sum - и curl http://example.com/ | md5sum - выдает одинаковые контрольные суммы, поэтому диагностическая информация определенно собирается только в stderr и, таким образом, в обход трубопровода.