2011-01-12 15 views
18

को तर्क देने के लिए एक तर्क के रूप में दस्तावेज़ है क्या यहां एक दस्तावेज़ को बैश फ़ंक्शन तर्क के रूप में पास करना संभव है, और फ़ंक्शन में पैरामीटर को बहु-पंक्तिबद्ध चर के रूप में संरक्षित किया गया है? निम्नलिखित लाइनों के साथयहां फ़ंक्शन

कुछ:

function printArgs { 
echo arg1="$1" 
echo -n arg2= 
cat <<EOF 
$2 
EOF 
} 

printArgs 17 <<EOF 
18 
19 
EOF 

या हो सकता है:

printArgs 17 $(cat <<EOF 
18 
19 
EOF) 

मैं एक यहाँ दस्तावेज है कि मैं के रूप में आदेश पर अमल करने के लिए ssh को खिलाने के लिए चाहते हैं, और ssh सत्र है एक बैश समारोह से बुलाया।

उत्तर

5

आप कुछ का उपयोग नहीं कर रहे हैं कि मानक को अवशोषित करेंगे

$ foo() { while read -r line; do var+=$line; done; } 
$ foo <<EOF 
a 
b 
c 
EOF 
+1

बस एक एफवाईआई आ रहा है। आप "जबकि" – joeb

+1

@joeb के साथ पुनरावृत्ति के बजाय फ़ंक्शन में "बिल्ली/dev/stdin" भी कर सकते हैं: बस सादा 'cat' wi l l काम। –

+0

दोह। बेशक यह होगा। अच्छी पकड़! – joeb

13

कि जिस तरह से संभव हो जाएगा है:

printArgs 17 "$(cat <<EOF 
18 
19 
EOF 
)" 

लेकिन आप इस के लिए एक हियरडॉक का उपयोग करना चाहते हैं?

print Args 17 "18 
19" 

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

+1

शायद 'ईओएफ' और '(" '? –

+0

के बीच एक नई लाइन होनी चाहिए, मैं बैच मोड में मूल्यांकन करने के लिए Emacs के लिए एक बड़ा बदसूरत रूप पारित करना चाहता हूं; यह" हैक "के लिए एक आदर्श उपयोग केस है। –

+0

और महीनों बाद मुझे अपने टिनीशेम बैच प्रोसेसर में मूल्यांकन करने के लिए जीआईएमपी के लिए एक बड़ा बदसूरत रूप पारित करने की आवश्यकता है।ऐसा लगता है कि <3 –

1

एक तरह से यहां डॉक और एक समारोह के माध्यम से ssh को आदेश को खिलाने के लिए के रूप में तो यह है:

#!/bin/sh 
# define the function 
printArgs() { 
echo "$1" 
ssh -T remotehost 
} 
# call it with a here document supplying its standard input 
printArgs 17 <<EOF 
uname 
uptime 
EOF 

परिणाम:

17 
Linux remotehost 2.6.32-5-686 ... 
Last login: ... 
No mail. 
Linux 
16:46:50 up 4 days, 17:31, 0 users, load average: 0.06, 0.04, 0.01 
0

xargs रों: इनपुट, तो आप कुछ है जो करता है यह प्रदान करना होगा वही करना चाहिए जो आप चाहते हैं। यह एक कमांड के लिए तर्क को मानक इनपुट कन्वर्ट

$ xargs -0 <<EOF printArgs 17 
18 
19 
EOF 

(नोटिस -0 नई-पंक्तियों को संरक्षित करने के लिए अनुमति देते हैं) लेकिन आप विशेष मामले के लिए, मैं सुझाव है कि आप ssh के मानक इनपुट पर आदेश भेजने के लिए:

$ ssh host <<EOF 
ls 
EOF 
+1

'xargs' एक शेल फ़ंक्शन नहीं कॉल कर सकता है, क्योंकि यह' execve() 'का उपयोग करता है। इस प्रकार, प्रश्न में "बैश फ़ंक्शन" बाधा प्रासंगिक है - नियमित आदेशों के साथ परीक्षण नहीं करेगा। –

+0

@ चार्ल्स डफी अच्छा पकड़ – Jezz

3

बिल्डिंग नेड के जवाब पर, मेरा समाधान फ़ंक्शन को एक इनपुट सूची या हेरेडोक के रूप में अपना इनपुट लेने की अनुमति देता है।

printArgs() (
    [[ $# -gt 0 ]] && exec <<< $* 
    ssh -T remotehost 
) 

तो आप इस

printArgs uname 

या इस

printArgs << EOF 
uname 
uptime 
EOF 

तो तुम एक आदेश और कई आदेशों के लिए लंबे समय से फार्म के लिए पहले फार्म का उपयोग कर सकते हैं कर सकते हैं।

+0

प्यारा। बहुत बहुत प्यारा। –

संबंधित मुद्दे