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