2011-01-12 34 views
18

Burada bir belgeyi bash işlevi argümanı olarak iletmek mümkün mü ve işlevde çok çizgili bir değişken olarak korunmuş bir parametre var mı? Aşağıdaki satırlar boyuncaBurada bash işlevine bir argüman olarak döküman

şey:

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

printArgs 17 <<EOF 
18 
19 
EOF 

ya da belki:

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

Ben komutları yürütmek üzere ssha beslemek istiyorum bir buraya belgeyi var ve SSH seansı bash fonksiyonundan çağrıldı.

cevap

5

standart absorbe edecek

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

Sadece bir FYI geliyor gibi görünüyor. "Cat/dev/stdin" işlevini "while" ile yineleme yerine "while" olarak da yapabilirsiniz. – joeb

+1

@joeb: Sadece düz 'cat' l l l work. –

+0

doh. Tabii ki yapardı. İyi yakalama! – joeb

13

mümkün olacağını yoludur:

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

Ama neden bunun için bir yorumlu metin kullanmak isteyeyim?

print Args 17 "18 
19" 

onu yapmak daha iyi olduğu göz önünde bulundurun: Eğer dosyanın içeriğini almak için cat kullanın (ab) zorunda heredoc argümanlar bir dosya olarak ele alınır, neden sadece böyle bir şey yapamaz ssh için çalıştırmak istediğiniz bir betik ve daha sonra böyle bir hack denemek için çalıştırın, çünkü bash hala değişkenleri genişletir ve çok satırlı argümanında böyle. Bir burada doc ve bir fonksiyonu sayesinde ssha komutları beslemek için

+1

Belki de "EOF" ve "(" '? –

+0

" arasında bir satır sonu olmalıdır. Toplu modda değerlendirmek için Emacs için çok çirkin bir form vermek istiyorum, bu "kesmek" için mükemmel bir kullanım örneğidir. –

+0

Ve aylar sonra, TinyScheme batch işlemcisini değerlendirmek için GIMP için çok çirkin bir form iletmem gerekiyor.Sadece <3 –

1

bir yolu olarak böyledir:

#!/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 

sonuçları: Eğer bir şey kullanmıyorsanız

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 s: girdi, o zaman öyle bir şey sunmak zorundadır Tam olarak ne istediğini yap. Bu

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

(yeni satırlar korumak için izin bildirim -0) bir komut için argüman standart giriş dönüştürmek Ama özel durum için, ssh standart girişinde komutu göndermek için önermek:

$ ssh host <<EOF 
ls 
EOF 
+1

'xargs', execve()' işlevini kullandığı için kabuk işlevini çağıramaz. Böylece, sorudaki "bash fonksiyonu" kısıtlaması uygun - düzenli komutlarla test yapmak yapmaz. –

+0

@CharlesDuffy İyi yakalama – Jezz

3

Building Ned'in cevabı üzerine, çözümüm, işlevin bir argüman listesi olarak veya heredoc olarak girişini yapmasına izin veriyor.

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

Yani bunun

printArgs uname 

veya bu

printArgs << EOF 
uname 
uptime 
EOF 

Yani tek komutlar ve çoklu komutlar için uzun form için ilk formu kullanabilirsiniz yapabilirsiniz.

+0

Sevimli. Çok çok tatlı. –

İlgili konular