मैं कर्ल -v के आउटपुट को कैसे पाइप या रीडायरेक्ट करूं?


117

किसी कारण से आउटपुट हमेशा टर्मिनल पर प्रिंट हो जाता है, चाहे मैं इसे 2> या> या के माध्यम से रीडायरेक्ट करूं। क्या इस से निकाल पाने के लिए कोई तरीका है? ये क्यों हो रहा है?


3
यदि मैं करता हूं curl -v url 2>&1, तो त्रुटियों को सही ढंग से मेरे लिए मानक आउटपुट पर पुनर्निर्देशित किया जाता है।
जोश ली

जवाबों:


134

-sप्रगति मीटर को हटाने के लिए (मौन) विकल्प जोड़ें , फिर प्रतिक्रिया बॉडी के समान ही fd पर वर्बोज़ आउटपुट प्राप्त करने के लिए stdout पर पुनर्निर्देशित करें

curl -vs google.com 2>&1 | less

3
यह अधिकांश वेबसाइटों के लिए काम करता है, लेकिन किसी कारण से मेरी मशीन पर स्थानीय सर्वर अभी भी पूर्ण आउटपुट प्रिंट करता है, भले ही मैं `2> & 1 करता हूं? grep asdfasdfasdfasdfdfs` या ऐसी ही कुछ बातें। हेडर सहित पूर्ण आउटपुट अभी भी कंसोल पर प्रदर्शित होता है। क्या कोई अन्य स्ट्रीम है जिसे मैं grep में पाइप कर सकता हूं कुछ डेटा जो मुझे चाहिए?
3

आप वास्तव में कौन सी जानकारी निकालने की कोशिश कर रहे हैं, और आप कौन सी जानकारी फेंकना चाहते हैं। मैंने आपके प्रश्न का अर्थ यह समझा कि आप चाहते हैं कि आउटपुट के सभी -v stdout के लिए निर्देशित हों।
सिंगलएनजेशन इलिमिनेशन

मैं कुछ कुकीज़ को प्रोसेस करना चाहता हूं (मूल रूप से कुकीज़ से कुछ जानकारी प्राप्त करें और कुछ अन्य सामान करें)। हां, मैं चाहता हूं कि सब कुछ एसटीडी से बाहर हो जाए, इसलिए मैं पाइप के माध्यम से जो कुछ भी चाहता हूं उसे संसाधित कर सकता हूं। वर्तमान में कुछ आउटपुट केवल कंसोल पर प्रदर्शित होते हैं और पुनर्निर्देशित करना असंभव लगता है और मुझे यकीन नहीं है कि क्यों।
जॉन्ड्री

क्या आप स्क्रीन पर प्रदर्शित होने वाले आउटपुट का स्क्रीनशॉट पोस्ट कर सकते हैं जिसे आप कैप्चर करना चाहते हैं? मुझे नहीं पता कि आप किस तरह का आउटपुट देख सकते हैं जो संभवतः याद किया जा सकता है 2>&1
सिंगलनएजिनेशन इलेक्शन

यह किसी भी अन्य वेबसाइट के साथ आउटपुट का सिर्फ एक ही प्रकार है। अंतर केवल इतना है कि सर्वर स्थानीय रूप से चल रहा है। क्या किसी प्रोग्राम को कंसोल पर प्रिंट करने का कोई तरीका है लेकिन क्या उस टेक्स्ट को स्टाउट / स्ट्रीट द्वारा कैप्चर नहीं किया गया है?
जॉन्ड्री

115

आपके URL में शायद ampersands है। मुझे भी यह समस्या थी, और मुझे महसूस हुआ कि मेरा URL ampersands (CGI वैरिएबल्स पास होने से) से भरा था और इसलिए सब कुछ एक अजीब तरीके से बैकग्राउंड में भेजा जा रहा था और इस तरह ठीक से रीडायरेक्ट नहीं हो रहा था। यदि आप URL के चारों ओर उद्धरण डालते हैं तो इसे ठीक कर देगा।


1
मुझे भी यही समस्या थी। 2> और 1 की कोई आवश्यकता नहीं है इसलिए मैं आउटपुट और कनेक्शन लॉग को अलग रख सकता हूं। धन्यवाद रोडनोटकेन।
क्वोरियन

3
लव स्टैक-ओ ... मुझे यह q, और URL में ampersands का उल्लेख मिला। यह मेरे चारों ओर उद्धरण लगाता है, और समस्या हल हो गई है।
पॉल ३

2
भावों ने मेरे लिए चाल चली। मुझे लगा जैसे कर्ल अन्य थ्रेड्स में निष्पादित कर रहा था। आपका बहुत बहुत धन्यवाद !
vdolez

1
मेरी शाम को बचाने से पहले पांच मिनट के लिए वेब पर खोज करना था :)
शुतिएह

यीशु, कर्ल में एक भयानक बग - बहुत कम से कम यह विफल होना चाहिए या चेतावनी देना चाहिए। आपके २०१२ के उत्तर ने मुझे २०१ answer में मदद की। जब तक मैं आपके उत्तर में नहीं आया, मुझे इसे हल करने के लिए ३० मिनट लगे। धन्यवाद!
मौविस लेडफोर्ड

29

ऊपर दिया गया जवाब मेरे काम नहीं आया, आखिरकार इस वाक्य रचना में क्या था:

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

टी आउटपुट को स्क्रीन पर रखता है, लेकिन इसे मेरे लॉग में भी जोड़ता है।


1
&> /dev/stdoutनिश्चित रूप से लापता हिस्सा था, धन्यवाद
मत्तसैन

10

यदि आपको किसी फ़ाइल में आउटपुट की आवश्यकता है तो आप एक अनुप्रेषित का उपयोग कर सकते हैं:

curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1

कृपया सुनिश्चित करें कि फ्लिप करने नहीं हो >curl-output.txtऔर 2>&1है, जो होगा की वजह से काम नहीं बैश के पुनर्निर्देशन व्यवहार


3

मुझे एक ही बात मिली: कर्ल अपने आप को STDOUT में प्रिंट कर लेगा, लेकिन दूसरे प्रोग्राम में नहीं जा सकता।

सबसे पहले, मुझे लगा कि मैंने पहले आउटपुट को इको करने के लिए xargs का उपयोग करके इसे हल किया था:

curl -s ... <url> | xargs -0 echo | ...

लेकिन फिर, जैसा कि टिप्पणियों में बताया गया है, यह xargs भाग के बिना भी काम करता है, इसलिए -s(साइलेंट मोड) STDOUT को बाहरी प्रगति आउटपुट को रोकने की कुंजी है:

curl -s ... <url> | perl  -ne 'print $1 if /<sometag>([^<]+)/'

उपरोक्त उदाहरण <sometag>कर्ल स्टेटमेंट के XML आउटपुट से सरल सामग्री (जिसमें कोई एम्बेडेड टैग नहीं है) को पकड़ लेता है ।


2
आपके उदाहरणों में 'xargs -0 echo |' अनावश्यक है। जब तक आपके पास 'कर्ल-एस' है, आप आउटपुट को दूसरे प्रोग्राम में पाइप कर सकते हैं।
रयान हॉरिसबर्गर

1

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

curl -vs google.com 2>&1

हालाँकि अगर किसी फाइल को आउटपुट प्राप्त करने की आवश्यकता है,

curl -vs google.com > out.txt 2>&1

कार्य करना चाहिए।


1
यह 2011 के स्वीकृत उत्तर के लिए कोई वास्तविक मूल्य नहीं जोड़ता है। यदि कुछ भी हो, तो यह उस उत्तर के लिए एक टिप्पणी हो सकती है।
त्रिनकोट

0

निम्नलिखित ने मेरे लिए काम किया:

एक स्क्रिप्ट नाम में अपने कर्ल बयान रखो abc.sh

अब चलाएं:

sh abc.sh 1>stdout_output 2>stderr_output

आपको अपने कर्ल के परिणाम stdout_outputऔर प्रगति की जानकारी मिल जाएगी stderr_output


0

यह सरल उदाहरण दिखाता है कि कर्ल आउटपुट को कैसे कैप्चर किया जाए, और इसे बैश स्क्रिप्ट में उपयोग किया जाए

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.