पाइप चर प्रदान करता है


19

सादगी के लिए मैं करना चाहूंगा:

echo cart | assign spo;
echo $spo  

आउटपुट: गाड़ी

क्या ऐसा कोई assignएप्लिकेशन मौजूद है?

मैं प्रतिस्थापन के उपयोग से ऐसा करने के सभी तरीकों से अवगत हूं।


बिना प्रतिस्थापन के आप ऐसा क्यों करना चाहते हैं?
थानातोस 19

मुझे उल्टा पोलिश संकेतन प्रवाह पसंद है जब केवल पाइप के साथ लिखना। मैं बहुत तेजी से कोडिंग कर रहा हूं और कोड की गुणवत्ता / गति इतनी महत्वपूर्ण नहीं है। इसके अलावा, जब मैं इसका
पीछा

यदि आप डिबगिंग में आसानी के बारे में चिंतित हैं, तो बैकटिक्स कमांड को अलग-अलग लाइनों की एक श्रृंखला पर रखने पर विचार करें। A=$( some | command | here )से प्रत्येक के साथ some |, command |और hereअपनी स्वयं की पंक्ति।
रोइमा

जवाबों:


11
echo cart | { IFS= read -r spo; printf '%s\n' "$spo"; }

तब तक काम करेंगे जब तक कि केवल एक पंक्ति के आउटपुट के रूप echoमें ( अनुगामी न्यूलाइन वर्ण के spoपरिवर्तनशील के बिना आउटपुट को स्टोर करें ) echo

आप हमेशा ऐसा कर सकते हैं:

assign() {
  eval "$1=\$(cat; echo .); $1=\${$1%.}"
}
assign spo < <(echo cart)

निम्नलिखित समाधान bashस्क्रिप्ट में काम करेंगे , लेकिन bashसंकेत में नहीं:

shopt -s lastpipe
echo cat | assign spo

या:

shopt -s lastpipe
whatever | IFS= read -rd '' spo

whateverपहले NUL वर्णों के आउटपुट को संग्रहीत करने के लिए ( bashचर NUL वर्णों को वैसे भी संग्रहीत नहीं कर सकते) $spo

या:

shopt -s lastpipe
whatever | readarray -t spo

के उत्पादन में स्टोर करने के लिए whateverमें $spo सरणी (एक सरणी तत्व प्रति पंक्ति)।


1
वहाँ IFS=और के बीच एक जगह नहीं होनी चाहिए read?
कैसरसोल

सभी ओलों पिछले पाइप। साथ ही साइड नोट सेट + m (ermmm या -m) की आवश्यकता होती है एक कमांड लाइन से वह अंतिम पाइप काम के नियंत्रण के साथ काम नहीं करता है।
मेगेप्रोस्पोरो

17

आप इस तरह से कुछ कर सकते हैं, यदि आप उपयोग करते हैं bash:

echo cart | while read spo; do echo $spo; done

दुर्भाग्य से, परिवर्तनशील लूप के बाहर चर "खराब" मौजूद नहीं होगा। यदि आप प्राप्त कर सकते हैं कि आप लूप के अंदर क्या चाहते हैं, तो यह काम करेगा।

आप वास्तव में लगभग वही कर सकते हैं जो आपने ऊपर ATT ksh (pdksh या mksh में नहीं) या शानदार ओश में लिखा था:

% echo cart | read spo
% echo $spo
cart

तो, एक और उपाय ksh या zsh का उपयोग करना होगा।


1
आप कोर्न शेल (उदाहरण के लिए mksh) में echo cart |& while read -p spo; do echo $spo; donewhile IFS= read -p -r spo; do…
कॉपोरोसेस का

2

अगर मैं इस मुद्दे को सही ढंग से समझता हूं तो आप एक चर के लिए stdout करना चाहते हैं। कम से कम यही तो मैं देख रहा था और यहीं खत्म हो गया। तो मेरे भाग्य को साझा करने वालों के लिए:

spa=$(echo cart)

cartचर को निर्दिष्ट करता है $spa


2
इसे वे प्रतिस्थापन कहते हैं, जिसे ओपी टालना चाहता था।
दिमित्री ग्रिगोरीव

यह मेरे लिए उपयोगी था, मुझे बस इसे एक चर में निर्दिष्ट करने की आवश्यकता थी, मुझे परवाह नहीं थी कि यह कैसे मिला!
क्रिस मैरिकिक

1

यदि आप बस वर्तमान पाइप स्ट्रीम उपयोग का उत्पादन करना चाहते हैं cat

echo cart | cat 

यदि आप अपनी कमांड श्रृंखला जारी रखना चाहते हैं, teeतो आउटपुट का इको करने के लिए कमांड का उपयोग करने का प्रयास करें ।

echo cart | tee /dev/tty | xargs ls

आप कमांड को छोटा करने के लिए एक अन्य का उपयोग कर सकते हैं।

alias tout='tee /dev/tty'
echo cart | tout | xargs ls

क्यों आप एक सादे करने के लिए उत्पादन करना चाहते हैं cat?
रोज़ा

1
@roaima कुछ कमांड पहचानते हैं कि वे एक टर्मिनल पर चल रहे हैं यदि वे पाइप से आउटपुट कर रहे हैं तो इससे अलग व्यवहार करें। विशेष रूप से वे वर्तमान स्क्रीन चौड़ाई के लिए लाइनों को छोटा कर सकते हैं। अधिकांश कमांड के लिए कैट कमांड बेमानी है।
बिलथोर

आह ठीक है, मैं अब देख रहा हूं कि आप क्या वर्णन करने की कोशिश कर रहे थे। echo | catनिर्माण मुझे फेंक दिया।
रोएमा

1

यहाँ समस्या का मेरा समाधान है।

# assign will take last line of stdout and create an environment variable from it
# notes: a.) we avoid functions so that we can write to the current environment
#        b.) aliases don't take arguments, but we write this so that the "argument" appears
#            behind the alias, making it appear as though it is taking one, which in turn
#            becomes an actual argument into the temporary script T2.
# example: echo hello world | assign x && echo %x outputs "hello world"
alias assign="tail -1|tee _T1>/dev/null&&printf \"export \\\$1=\$(cat _T1)\nrm _T*\">_T2&&. _T2"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.