bash - एक पाइप में दूसरे कमांड के लिए काम नहीं कर रहे बैश में कमांड से पहले एक पर्यावरण चर सेट करना




environment-variables (3)

आप eval भी उपयोग कर सकते हैं:

FOO=bar eval 'somecommand someargs | somecommand2'

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

जैसे-जैसे हमें कुछ नियमित विचार मिलते हैं, संभवत: हर किसी को खुश करने का विकल्प देने के लिए यह अच्छा होता है, और इस त्वरित eval "चाल" के सभी लाभ (और शायद और भी!) है। बस एक समारोह का उपयोग करें! अपने सभी आदेशों के साथ एक फ़ंक्शन को परिभाषित करें:

mypipe() {
    somecommand someargs | somecommand2
}

और इसे अपने पर्यावरण चर के साथ निष्पादित करें:

FOO=bar mypipe

किसी दिए गए खोल में, आमतौर पर मैं एक चर या चर सेट करता हूं और फिर कमांड चलाता हूं। हाल ही में मैंने एक कमांड परिभाषा को कमांड की तैयारी की अवधारणा के बारे में सीखा:

FOO=bar somecommand someargs

यह काम करता है ... तरह का। यह काम नहीं करता है जब आप एक एलसी_ * वैरिएबल बदल रहे हैं (जो कमांड को प्रभावित करता है लेकिन इसके तर्क नहीं, उदाहरण के लिए, '[az]' char ranges) या जब आउटपुट को अन्य कमांड पर पाइप करते हैं:

FOO=bar somecommand someargs | somecommand2  # somecommand2 is unaware of FOO

मैं कुछ कमांड 2 को "FOO = bar" के साथ भी प्रीपेड कर सकता हूं, जो काम करता है लेकिन जो अवांछित डुप्लिकेशंस जोड़ता है, और यह वेरिएबल (जैसे '[az]') के आधार पर व्याख्या किए गए तर्कों में सहायता नहीं करता है।

तो, एक लाइन पर ऐसा करने का एक अच्छा तरीका क्या है? मैं इस क्रम पर कुछ सोच रहा हूं:

FOO=bar (somecommand someargs | somecommand2)  # Doesn't actually work

संपादित करें: मुझे बहुत अच्छे जवाब मिल गए हैं! लक्ष्य यह है कि इसे "निर्यात" के बिना अधिमानतः एक लाइनर रखना है। कॉल करने के लिए कॉल का उपयोग करने वाली विधि सबसे अच्छी थी, हालांकि इसमें "निर्यात" के साथ मूलभूत संस्करण थोड़ा अधिक कॉम्पैक्ट था। एक पाइप की बजाय पुनर्निर्देशन का उपयोग करने की विधि भी दिलचस्प है।


परिवर्तनीय निर्यात करने के बारे में, लेकिन केवल subshell के अंदर ?:

(export FOO=bar && somecommand someargs | somecommand2)

कीथ के पास एक बिंदु है, बिना शर्त आदेशों को निष्पादित करने के लिए, ऐसा करें:

(export FOO=bar; somecommand someargs | somecommand2)

FOO=bar bash -c 'somecommand someargs | somecommand2'




environment-variables