bash function shell arguments heredoc

Aquí documento como un argumento para la función de bash



function shell (5)

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

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 un documento aquí que quiero enviar a ssh como los comandos a ejecutar, y se llama a la sesión ssh desde una función bash.


El camino a eso sería posible es:

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

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

print Args 17 "18 19"

Tenga en cuenta que es mejor hacer una secuencia de comandos en la máquina a la que desea ssh y ejecutarla y luego intentar un truco como este porque bash seguirá expandiendo las variables y demás en su argumento multilínea.


Si no está utilizando algo que absorba la entrada estándar, tendrá que proporcionar algo que lo haga:

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


Sobre la base de 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 puedes hacer esto

printArgs uname

o esto

printArgs << EOF uname uptime EOF

Por lo tanto, puede usar la primera forma para comandos individuales y la forma larga para comandos múltiples.


Una forma de enviar comandos a ssh a través de un documento aquí y una función es 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


xargs debe hacer exactamente lo que quieres. Convierte la entrada estándar en un argumento para un comando (aviso -0 permite preservar nuevas líneas)

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

Pero para su caso especial, le sugiero que envíe un comando en la entrada estándar de ssh:

$ ssh host <<EOF ls EOF