सवाल यदि HTTP स्थिति कोड 200 नहीं है तो क्या मैं 0 से अलग एक्जिट कोड के साथ कर्ल विफल कर सकता हूं?


मैं हमेशा यह मान रहा था कि जब कर्ल को HTTP 500 प्रतिक्रिया मिली तो यह एक निकास कोड लौटा रहा था जिसका मतलब विफलता (! = 0) था, लेकिन ऐसा प्रतीत होता है नहीं मुकदमा।

क्या कोई तरीका है कि अगर मैं HTTP स्थिति कोड 200 नहीं है तो क्या मैं 0 से अलग बाहर निकलने के लिए कर्ल विफल कर सकता हूं? मुझे पता है कि मैं उपयोग कर सकता हूँ -w "%{http_code}" लेकिन यह इसे STDOUT में रखता है, बाहर निकलने के कोड के रूप में नहीं (इसके अलावा, मैं आउटपुट को कैप्चर करने में भी रूचि रखता हूं, जिसे मैं किसी फ़ाइल पर रीडायरेक्ट नहीं करना चाहता, बल्कि स्क्रीन पर)।


170
2018-05-01 12:37


मूल




जवाब:


curl --fail आप जो चाहते हैं उसका हिस्सा है:

से man curl:

-f, --fail

(HTTP) सर्वर त्रुटियों पर चुपचाप (बिल्कुल कोई आउटपुट) विफल। असफल प्रयासों के साथ बेहतर सौदा करने के लिए यह स्क्रिप्ट इत्यादि को बेहतर ढंग से सक्षम करने के लिए किया जाता है। सामान्य मामलों में जब कोई HTTP सर्वर दस्तावेज़ वितरित करने में विफल रहता है, तो यह एक HTML दस्तावेज़ देता है जो बताता है (जो अक्सर और क्यों वर्णन करता है)। यह ध्वज कर्ल को आउटपुट करने से रोक देगा और त्रुटि 22 लौटाएगा।

यह विधि असफल नहीं है और ऐसे अवसर हैं जहां गैर-सफल प्रतिक्रिया कोड फिसल जाएंगे, खासकर जब प्रमाणीकरण शामिल होता है (प्रतिक्रिया कोड 401 और 407)।

लेकिन यह स्क्रीन पर आउटपुट ब्लॉक करता है।


191
2017-10-10 18:36



तो इसके कौन से हिस्से यह करते हैं और नहीं करते हैं? - rogerdpack
@rogerdpack tl; dr यह खराब प्रतिक्रिया का पता लगाने पर nonzero लौटाता है, लेकिन यह ओपी को प्रतिक्रिया को कैप्चर नहीं करने देगा - rampion
यह HTTP 301 स्थायी रूप से ले जाएँ नहीं पकड़ता है। कर्ल अभी भी बाहर निकलें कोड 0 दिया। - wisbucky
@ विस्बकी 301 कोई त्रुटि नहीं है, यह एक पुनर्निर्देशन स्थिति कोड है। त्रुटियां 4xx और 5xx स्थिति कोड हैं। - M. Justin


यदि आप केवल घुमावदार पृष्ठ की सामग्री प्रदर्शित करना चाहते हैं, तो आप यह कर सकते हैं:

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

STDOUT को HTTP स्थिति कोड लिखते समय यह पृष्ठ की सामग्री STDERR को लिखता है, इसलिए इसे चर के लिए असाइन किया जा सकता है स्थिति का कोड


67
2018-05-01 15:31



अगर मैं विफलता पर प्रतिक्रिया आउटपुट करना चाहता हूं तो कैसे (गैर 200), लेकिन एक गैर वापसी 0 स्क्रिप्ट से स्टेटस कोड? - Justin
@ जस्टिन: इसके बारे में क्या if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi ? - ghoti
@ghoti: केवल हस्ताक्षरित 8-बिट निकास कोड समर्थित हैं, ताकि थोड़ा भ्रमित हो सके। - Dennis
आह, दाएं - और कोड 8 बिट्स पर लपेटेंगे, इसलिए त्रुटि 404 बाहर निकलने के मूल्य बन जाती है 148, 500 244 बन जाती है। वास्तव में उलझन में! :-) - ghoti
थोड़ी भिन्नता के रूप में, यह stdout की प्रतिक्रिया को पुनर्निर्देशित करते समय कोड को एक चर में कैप्चर करता है, stderr नहीं: { code=$(curl ... as above ...); } 2>&1 चाल है { ... } 2>&1 जो एक अलग खोल के रूप में spawning, जबकि पुनर्निर्देशन की अनुमति देता है ( ... ) होगा। - Tobia


मैं झंडे के संयोजन का उपयोग कर ऐसा करने में सक्षम था:

curl --silent --show-error --fail URL

--silent प्रगति और त्रुटि छुपाता है
--show-त्रुटि द्वारा छिपा त्रुटि संदेश दिखाता है --silent
--fail अनुरोध विफल होने पर 0 से बाहर निकलने वाला कोड देता है


14
2017-09-12 14:48



यह सर्वर उत्तर नहीं दिखाता है। मैं ओपी नहीं हूं लेकिन मुझे संदेह है कि वह सर्वर से लौटाए गए सर्वर से कोई त्रुटि संदेश देखना चाहता था। एक के अलावा --silent --show-error --fail बस के समान काम करता है -f/--fail। - waste
वास्तव में, --fail निकास कोड लौटाता है 22, दस्तावेज के रूप में। - Quolonel Questions
यह HTTP 301 स्थायी रूप से ले जाएँ नहीं पकड़ता है। कर्ल अभी भी बाहर निकलें कोड 0 दिया। - wisbucky
@ विस्बकी 301 कोई त्रुटि नहीं है, यह एक पुनर्निर्देशन स्थिति कोड है। त्रुटियां 4xx और 5xx स्थिति कोड हैं। - M. Justin
@ विस्बाकी के लिए उचित होने के लिए, मूल प्रश्न बताता है "[...] यदि HTTP स्थिति कोड 200 नहीं है"। पहले कहीं भी "त्रुटि" का कोई उल्लेख नहीं है। - ken