Подтвердить что ты не робот

Здесь документ как аргумент функции bash

Можно ли передать документ здесь как аргумент функции bash, а в функции параметр сохраняется как многоуровневая переменная?

Что-то в следующих строках:

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

printArgs 17 <<EOF
18
19
EOF

или возможно:

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

У меня есть документ, который я хочу передать ssh в качестве команд для выполнения, а сеанс ssh вызывается из функции bash.

4b9b3361

Ответ 1

Если вы не используете что-то, что поглотит стандартный ввод, тогда вам нужно будет что-то сделать:

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

Ответ 2

Возможный путь:

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

Но зачем вы хотите использовать heredoc для этого? heredoc рассматривается как файл в аргументах, поэтому вы должны (ab) использовать cat для получения содержимого файла, почему бы просто не сделать что-то вроде:

print Args 17 "18
19"

Пожалуйста, имейте в виду, что лучше сделать script на машине, на которой вы хотите ssh, и запустить ее, а затем попробовать взломать как это, потому что bash будет по-прежнему расширять переменные и такие в вашем многострочном аргументе.

Ответ 3

Основываясь на ответе Ned, мое решение позволяет функции принимать свой вход как список аргументов или как heredoc.

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

Итак, вы можете сделать это

printArgs uname

или

printArgs << EOF
uname
uptime
EOF

Таким образом, вы можете использовать первую форму для одиночных команд и длинную форму для нескольких команд.

Ответ 4

Один из способов подачи команд в ssh через этот документ и функцию такой:

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

Результаты:

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

Ответ 5

xargs должен делать именно то, что вы хотите. Он преобразует стандартный ввод в аргумент для команды (уведомление -0 позволяет сохранить символы новой строки)

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

Но для вас особый случай, я предлагаю вам отправить команду на стандартный ввод ssh:

$ ssh host <<EOF
ls
EOF