पाइप के साथ हेरेडोक का संयोजन विफल रहता है


1

मैं कर्ल का उपयोग करके एक एपीआई में लॉग इन करने का प्रयास कर रहा हूं। क्योंकि अनुरोध JSON से उम्मीद करता है, मैं इसका उपयोग कर रहा हूं:

curl -s -X POST -H "Content-Type: application/json" \
    $API_URL/auth -d@- <<EOF
{
  "id": "$USER@example.com",
  "password": "!password!"
}
EOF

... और वह ठीक काम कर रहा है। मुझे एक परिणाम मिलता है जो कुछ इस तरह दिखता है:

{"access_token":"jXed...I5mQ=","expires_in":3600}

लेकिन जब मैं एक चर में आउटपुट को पकड़ने का प्रयास करता हूं, तो यह काम नहीं करता है।

मैंने कोशिश की:

x=$(curl ...)

... लेकिन वह विफल रहता है bash: !password!: event not found

हाँ, मेरा पासवर्ड है एक के साथ शुरू !; यह एपीआई की एक परीक्षण स्थापना है, इसलिए मैं एक कमजोर पासवर्ड का उपयोग कर रहा हूं।

मुझे पता है कि अगर मैं इसका उपयोग करता हूं set +H, या इसे स्क्रिप्ट से चलाता हूं , तो bash कुछ भी नहीं करेगा !। मेरी परेशानी यह हे कि मे:

  1. मैं कभी-कभी स्क्रिप्ट को कमांड लाइन में कॉपी-पेस्ट करना चाहता हूं। छह महीने के समय में, मैं इस शिकन के बारे में भूल गया हूँ।
  2. बैश भी एक वंशानुगत के अंदर ऐसा करने का प्रयास क्यों कर रहा है?

इसके साथ पूर्वोक्त विचित्रता के कारण !, मैंने परिणामों को readइसके बजाय पाइप करने की कोशिश की :

(curl ...
EOF
) | read x

... लेकिन फिर यह किसी भी तरह हेरेडोक का प्रबंधन करता है, और सर्वर "अमान्य JSON" के बराबर प्रतिक्रिया करता है।

अगर मैं catइसके बजाय का उपयोग करता हूं curl, तो हेरेडोक संयोगवश खाली दिखता है।


मैंने बस catऔर हेरेडोक की कोशिश की है और इस व्यवहार को पुन: पेश नहीं कर सकता , जीबीयू बैश का उपयोग करके , संस्करण 4.3.11 (1)-Ubuntu पर -release
वंदारेड

जवाबों:


0

event not foundत्रुटि से बचने के लिए , बस set +Hस्क्रिप्ट में उपयोग करें । यह हानिरहित है, और आप इसे समझाते हुए एक टिप्पणी जोड़ सकते हैं।

| read xबस काम नहीं करता है; विशेष रूप से देखें: http://tiswww.case.edu/php/chet/bash/FAQ :

E4) अगर मैं कमांड के आउटपुट को 'रीड वेरिएबल' में पाइप करता हूं, तो रीड कमांड खत्म होने पर आउटपुट $ वेरिएबल में क्यों नहीं दिखता है?

बैश में, एक उप-प्रकार में | fooचलता fooहै। यह मूल शैल में परिवर्तन नहीं कर सकता है।

x=$(whatever) इसके बजाय उपयोग करें ।

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