2011-01-12 10 views
18

¿Es posible pasar un documento aquí como un argumento de función bash, y en la función tener el parámetro conservado como una variable de múltiples líneas?Aquí documento como un argumento para la función bash

Algo a lo largo de las siguientes líneas:

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

printArgs 17 <<EOF 
18 
19 
EOF 

o tal vez:

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

Tengo aquí el documento que quiero alimentar a ssh como los comandos a ejecutar, y la sesión de SSH es llamado desde una función bash.

Respuesta

5

Si usted no está usando algo que va a absorber norma de entrada, a continuación, tendrá que suministrar algo que lo hace:

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

Solo un FYI. También puede hacer "cat/dev/stdin" en la función en lugar de iterar con "while" – joeb

+1

@joeb: simplemente 'cat' wi l l work. –

+0

doh. Por supuesto que sí. ¡Buena atrapada! – joeb

13

La manera de que sería posible es:

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

Pero por qué le gustaría usar una heredoc para esto? heredoc se trata como un archivo en los argumentos por lo que tiene que (ab) uso cat para obtener el contenido del archivo, ¿por qué no hacer algo como:

print Args 17 "18 
19" 

Por favor, tenga en cuenta que es mejor hacer una secuencia de comandos en la máquina que desea ssh y ejecutar que luego intenta algunos hack como este porque bash aún expandirá variables y tal en su argumento de líneas múltiples.

+1

Quizás debería haber una nueva línea entre 'EOF' y' ("'? –

+0

Quiero pasar una gran forma fea para que Emacs lo evalúe en modo por lotes; este es un caso de uso perfecto para este "truco". –

+0

Y meses después necesito pasar una gran forma fea para que GIMP lo evalúe en su procesador por lotes TinyScheme.Parece que sigue apareciendo <3 –

1

Una forma de alimentar a los comandos ssh aquí a través de un documento y una función es tan así:

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

Los resultados:

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 Haría exactamente lo que quieras. Es convertir la entrada estándar al argumento de un comando (aviso -0 permitirá conservar los saltos de línea)

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

Pero para usted caso especial, le sugiero que permite enviar comandos de entrada estándar de SSH:

$ ssh host <<EOF 
ls 
EOF 
+1

'xargs' no puede llamar a una función de shell, ya que usa' execve() '. Por lo tanto, la restricción de "función bash" en la pregunta es pertinente; las pruebas con comandos regulares no funcionarán. –

+0

@CharlesDuffy Buena captura – Jezz

3

construcción en la respuesta de Ned, mi solución permite que la función tome su entrada como una lista de argumentos o como un heredoc.

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

Así que usted puede hacer esto

printArgs uname 

o esta

printArgs << EOF 
uname 
uptime 
EOF 

lo que puede utilizar la primera forma de comandos individuales y la forma larga de varios comandos.

+0

Linda. Muy muy lindo. –

Cuestiones relacionadas