CURL: पुनर्निर्देशन करते समय अजीब आउटपुट को कैसे दबाएं?


67

मैं stderrबैश शेल से सिर्फ एक cURL अनुरोध (जिसे भेजा जाता है ) के क्रिया खंडों को प्रिंट करने की कोशिश कर रहा हूं ।

लेकिन जब मैं stdoutइस तरह से पुनर्निर्देशित करता हूं :

curl -v http://somehost/somepage > /dev/null

परिणाम तालिका के कुछ प्रकार आउटपुट के बीच में दिखाई देते हैं stderr:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

अंत के पास इसके द्वारा अनुसरण किया गया:

{ [data not shown]
118   592    0   592    0     0  15714      0 --:--:-- --:--:-- --:--:-- 25739

जो प्रतिक्रिया हेडर को कम पठनीय बनाता है।

जब रीडायरेक्ट नहीं किया जाता है तो मुझे यह टेक्स्ट दिखाई नहीं देता है।


प्रभाव देखने का दूसरा तरीका:

तालिका दिखाई नहीं देती है:

curl -v http://somehost/somepage 2>&1

तालिका दिखाई देती है:

curl -v http://somehost/somepage 2>&1 | cat

1) यह कैसे आता है केवल कुछ विशेष प्रकार के रीडायरेक्ट से पता चलता है?

2) इसे दबाने का सबसे साफ तरीका क्या है?

धन्यवाद

जवाबों:


60

इसे इस्तेमाल करे:

curl -vs -o /dev/null http://somehost/somepage 2>&1

यही कारण है कि प्रगति मीटर को दबाने, भेज देंगे stdoutकरने के लिए /dev/nullऔर अनुप्रेषित stderr( -vकरने के लिए उत्पादन) stdout


32
धन्यवाद, -sकुंजी थी!
इयान मैकिनॉन 17

6
@IanMackinnon ध्यान दें कि आप के साथ -sलेकिन बिना -vत्रुटियों के जैसे कि आप कनेक्ट होने में विफलता नहीं देखेंगे। उसके लिए आपको mhoydis के उत्तर में भी -S(या --show-error) जोड़ना चाहिए ।
Artyom

लेकिन रीडायरेक्ट करते समय प्रगति पट्टी केवल पहली जगह में ही क्यों दिखाई देती है? मैं जब के उत्पादन में पाइप यह एक ही मुद्दे में भाग curlलिए jq। पाइपिंग के बिना कोई प्रगति पट्टी नहीं jq, फिर जब पाइपिंग से jqमुझे वापस जाना और जोड़ना होगा -s
साठ साल की उम्र में

@ sixty4bit: यह एक डिज़ाइन पसंद है जिसे डेवलपर्स ने बनाया है। कार्यक्रम का पता तब लग सकता है, जब STDOUTवह टटी न हो। जब आउटपुट पाइप नहीं किया जा रहा है, तो आप नहीं चाहते कि प्रगति की जानकारी सामान्य आउटपुट के साथ इंटरसेप्टर हो, जिसे आप देख सकते हैं और प्रगति का कुछ विचार कर सकते हैं। जब आउटपुट को पुनर्निर्देशित या पाइप किया जाता है, तो आप इसे नहीं देख सकते हैं ताकि आपके पास प्रगति के लिए कोई गेज न हो - जब तक कि प्रगति बार चालू न हो।
डेनिस विलियमसन

23
curl --fail --silent --show-error http://www.example.com/ > /dev/null

यह स्थिति संवाद को दबा देगा, लेकिन अन्यथा STDERR में त्रुटियों को आउटपुट करेगा।

user@host:~# curl http://www.yahoo.com > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  254k    0  254k    0     0   403k      0 --:--:-- --:--:-- --:--:--  424k

पुनर्निर्देशन करते समय उपरोक्त स्थिति तालिका को आउटपुट करती है।

user@host:~# curl --fail --silent --show-error http://www.yahoo.com > /dev/null

उपरोक्त स्थिति पुनर्निर्देशित करते समय स्थिति तालिका को दबा देती है, लेकिन त्रुटियां अभी भी STDERR में चली जाएंगी।

user@host:~# curl --fail --silent --show-error http://www.errorexample.com > /dev/null
curl: (6) Couldn't resolve host 'www.errorexample.com'

उपरोक्त STDERR के लिए एक त्रुटि का एक उदाहरण है।

user@host:~# curl -v --fail --silent --show-error http://www.errorexample.com > ~/output.txt 2>&1
user@host:~# cat ~/output.txt 
* getaddrinfo(3) failed for www.errorexample.com:80
* Couldn't resolve host 'www.errorexample.com'
* Closing connection #0
curl: (6) Couldn't resolve host 'www.errorexample.com'

STDOUT (इस मामले में, एक फ़ाइल के लिए) में STDERR को पुनर्निर्देशित करने के लिए अंत में 2> और 1 जोड़ें।


5

के अनुसार man curl:

-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

उदाहरण का उपयोग:

curl -s 'http://www.google.com'

या यदि आप bash में एक वैरिएबल में HTTP-BODY कैप्चर करना चाहते हैं

BODY=$( curl -s 'http://www.google.com' )
echo $BODY

आप उपयोग -sया --silentविनिमय कर सकते हैं ।


4

प्रश्न 1 के संदर्भ में ( कैसे cURL केवल तालिका को प्रदर्शित करता है जब आउटपुट पुनर्निर्देशित होता है), मुझे नहीं पता था कि कोई प्रोग्राम बता सकता है कि उसके आउटपुट को निर्देशित किया जा रहा है, लेकिन ऐसा लगता है कि POSIX सिस्टम पर एक फ़ंक्शन है isattyजो रिपोर्ट करता है कि नहीं एक फाइल डिस्क्रिप्टर एक टर्मिनल को संदर्भित करता है।


2
यहाँ एक बैश स्निपेट दिया गया है:[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
डेनिस विलियमसन

2

1) यह कैसे आता है केवल कुछ विशेष प्रकार के रीडायरेक्ट से पता चलता है?

कर्ल मैन पेज से

यदि आप HTTP POST या PUT अनुरोधों के लिए प्रगति मीटर चाहते हैं, तो आपको शेल रीडायरेक्ट (>), -o [फ़ाइल] या समान का उपयोग करके प्रतिक्रिया आउटपुट को फ़ाइल में पुनर्निर्देशित करना होगा।

कर्ल को रीडायरेक्ट का निर्धारण करने के लिए आइसैट्टी का उपयोग करना चाहिए और एक फ़ाइल या शेल पाइप पर रीडायरेक्ट होने पर प्रगति मीटर को प्रिंट करता है।

2) इसे दबाने का सबसे साफ तरीका क्या है?

कर्ल मैन पेज से

-s, --silent

मौन या शांत मोड। प्रगति मीटर या त्रुटि संदेश न दिखाएं। कर्ल म्यूट बनाता है। यह तब भी आपके द्वारा मांगे गए डेटा को आउटपुट करेगा, संभवतः टर्मिनल / स्टडआउट तक भी जब तक आप इसे रीडायरेक्ट नहीं करते।


1

वास्तविक त्रुटि संदेशों को रखने के लिए, आपको लॉग फ़ाइल में स्ट्रर लिखना चाहिए। ऐसा कुछ:

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null

0

एक प्रॉक्सी के पीछे होने के नाते मैं इस तरह से एक कमांड का उपयोग करता हूं।

दिनांक -s "$ (कर्ल --proxy http: // PROXY: 8080  -s http://google.com --head -s | grep दिनांक | sed 's / दिनांक: // g')"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.