2011-01-12 17 views
18

È possibile passare un documento qui come argomento della funzione bash e nella funzione il parametro è conservato come variabile multipla?Qui documento come argomento per la funzione bash

Qualcosa secondo le seguenti linee:

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

printArgs 17 <<EOF 
18 
19 
EOF 

o forse:

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

Ho un documento qui che voglio alimentare a ssh come comandi da eseguire, e la sessione SSH è chiamato da una funzione bash.

risposta

5

Se non stai usando qualcosa che assorbirà serie ingresso, quindi si dovrà fornire qualcosa che lo fa:

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

Solo una FYI. Puoi anche fare "cat/dev/stdin" nella funzione invece di iterare con "while" – joeb

+1

@joeb: Semplicemente 'cat' funzionerà. –

+0

doh. Certo che lo sarebbe. Buona pesca! – joeb

13

Il modo per che sarebbe possibile è:

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

Ma perché si vuole usare un heredoc per questo? heredoc viene trattata come un file negli argomenti in modo da avere a (ab) usa cat per ottenere il contenuto del file, perché no proprio fare qualcosa di simile:

print Args 17 "18 
19" 

Si prega di tenere a mente che è meglio fare uno script sulla macchina su cui si desidera eseguire ssh ed eseguirlo, quindi provare un po 'di hacking in questo modo, perché bash espanderà comunque variabili e simili nel tuo argomento multilinea.

+1

Forse dovrebbe esserci una nuova riga tra 'EOF' e' ("'? –

+0

Voglio passare una grande forma brutta per Emacs per valutare in modalità batch, questo è un caso d'uso perfetto per questo "hack". –

+0

E mesi dopo ho bisogno di passare una brutta forma per GIMP per valutare nel suo processore batch TinyScheme.Sembra che continui a salire <3 –

1

Un modo per alimentare i comandi ssh attraverso un qui doc e una funzione è come così:

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

I risultati:

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 farei esattamente quello che vuoi E 'convertire standard input per argomento per un comando (comunicazione -0 consentire di preservare ritorni a capo)

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

Ma per voi caso particolare, vi suggerisco di inviare il comando sullo standard input di ssh:

$ ssh host <<EOF 
ls 
EOF 
+1

'xargs' non può chiamare una funzione di shell, poiché usa' execve() '. Quindi, il vincolo della "funzione bash" nella domanda è pertinente - il test con i normali comandi non funzionerà. –

+0

@CharlesDuffy Buona cattura – Jezz

3

costruzione sulla risposta di Ned, la mia soluzione consente alla funzione di prendere il suo input come lista di argomenti o come heredoc.

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

Così si può fare questo

printArgs uname 

o questo

printArgs << EOF 
uname 
uptime 
EOF 

modo da poter utilizzare il primo modulo per comandi singoli e la forma a lungo per comandi multipli.

+0

Carino. Molto molto carina. –

Problemi correlati