Ответ 1
Если вы не используете что-то, что поглотит стандартный ввод, тогда вам нужно будет что-то сделать:
$ foo () { while read -r line; do var+=$line; done; }
$ foo <<EOF
a
b
c
EOF
Можно ли передать документ здесь как аргумент функции 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.
Если вы не используете что-то, что поглотит стандартный ввод, тогда вам нужно будет что-то сделать:
$ foo () { while read -r line; do var+=$line; done; }
$ foo <<EOF
a
b
c
EOF
Возможный путь:
printArgs 17 "$(cat <<EOF
18
19
EOF)"
Но зачем вы хотите использовать heredoc для этого? heredoc рассматривается как файл в аргументах, поэтому вы должны (ab) использовать cat
для получения содержимого файла, почему бы просто не сделать что-то вроде:
print Args 17 "18
19"
Пожалуйста, имейте в виду, что лучше сделать script на машине, на которой вы хотите ssh, и запустить ее, а затем попробовать взломать как это, потому что bash будет по-прежнему расширять переменные и такие в вашем многострочном аргументе.
Основываясь на ответе Ned, мое решение позволяет функции принимать свой вход как список аргументов или как heredoc.
printArgs() (
[[ $# -gt 0 ]] && exec <<< $*
ssh -T remotehost
)
Итак, вы можете сделать это
printArgs uname
или
printArgs << EOF
uname
uptime
EOF
Таким образом, вы можете использовать первую форму для одиночных команд и длинную форму для нескольких команд.
Один из способов подачи команд в 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
xargs
должен делать именно то, что вы хотите. Он преобразует стандартный ввод в аргумент для команды (уведомление -0
позволяет сохранить символы новой строки)
$ xargs -0 <<EOF printArgs 17
18
19
EOF
Но для вас особый случай, я предлагаю вам отправить команду на стандартный ввод ssh:
$ ssh host <<EOF
ls
EOF