Возможный объявить функцию локально и использовать ее в удаленном конце соединения SSH

AFAIK они предоставляют свою собственную реализацию OpenGL с драйверами, так что она уже должна быть установлена.

Однако перед установкой драйверов у вас должна была быть другая реализация с открытым исходным кодом, скорее всего Mesa.

Совет: мне никогда в жизни не приходилось устанавливать OpenGL в явном виде.

1
24.08.2018, 12:58
3 ответа

Похоже, вы ищете петлю:

for remote in two three four; do
    ez ssh "$remote" <<'END_SSH'
script
goes here
END_SSH
done

Здесь -документ — это просто документ, как и файл, перенаправленный в команду. Если у вас есть вызов функции в файле, который вы перенаправляете, а не в документе здесь -, то определение функции должно быть доступно в той же самой среде выполнения, чтобы вы могли ее вызвать. То же самое относится и к вызову функции в документе здесь -.

Определение функции в локальной оболочке не делает ее доступной для вызова на удаленной машине через ssh.


Две строки

STATUS=$((git status) 2>&1)
echo $STATUS

можно упростить до одной строки

git status 2>&1

Таким образом, ваш полный сценарий для удаленного выполнения:

cd /var/www/html && git status

... без функции.

Обратите внимание на &&между командами cdи git. Он останавливает вызов gitв случае сбоя cd. Это распространенный способ защиты от случайного запуска команды, если нужный каталог не существует (из-за непредвиденных обстоятельств ). Вы можете дополнительно сообщить об отсутствующем каталоге /var/www/htmlв сценарии.

Я также удалил объединение двух выходных потоков. Это позволяет вам делать это в вызывающей оболочке или обрабатывать их отдельно, если вы того пожелаете.

1
27.01.2020, 23:18

Предполагая, что ez sshвызывает оболочку (, возможно, удаленно, поскольку ssh предлагает )разобрать этот код на своем стандартном вводе и что эта оболочка такая же, как та, которая интерпретирует скрипт (и работает в той же локали )и что это либо ksh, bash или zsh (для поддержки typeset -f), вы можете сделать:

ez ssh two << EOSSH

$(typeset -f gitpull)
gitpull

EOSSH

То есть передать определение этой gitpullфункции оболочке, которую вызывает ez sshперед ее вызовом.Или с помощьюzsh:

ez ssh two << EOSSH
$functions[gitpull]
EOSSH

Или, конечно, можно:

gitpull='
  cd /var/www/html
  STATUS=$((git status) 2>&1)
  echo $STATUS
'
ez ssh two << EOSSH
$gitpull
EOSSH

или

printf '%s\n' "$gitpull" | ez ssh two

Другие подходы могут заключаться в использовании циклов, как уже предлагалось, или в:

ez_ssh_gitpull() {
  ez ssh "$@" << 'EOSSH'
    cd /var/www/html
    STATUS=$((git status) 2>&1)
    echo $STATUS
EOSSH
}

ez_ssh_gitpull two
ez_ssh_gitpull three
3
27.01.2020, 23:18

create a function outside of a heredoc and call it from within a heredoc, is this possible?

Ну, кажется, при условии, что вы не цитируете слово "здесь -документ" и используете "подстановку команд":

gitpull () { echo $1; }

cat << 'EOF'
$(gitpull T1)
EOF

$(gitpull ARG1)    <--- output of `cat`

cat << EOF 
$(gitpull ARG1)
EOF

ARG1               <--- output of `cat`
0
27.01.2020, 23:18

Теги

Похожие вопросы