LINUX.ORG.RU

Ответ на: комментарий от Yorween

получается я скрипт функцию выполняю через ssh на другом сервере

#!/usr/bin/env bash

FUNC='function FN1 {
    echo "в функции"
    exit 0
}'

ssh server "$FUNC; FN1"

echo "после функции"

./deploy1.sh
в функции
после функции

carter
() автор топика
Последнее исправление: carter (всего исправлений: 3)
Ответ на: комментарий от carter
-ssh server "$FUNC; FN1"
-
-echo "после функции"
+ssh server "$FUNC; FN1; echo \"после функции\""

Как так, карл?

anonymous
()
Ответ на: комментарий от carter

А зачем ты переменной присваиваешь строку с описанной функцией? Я не специалист по башу, но эти танцы с бубном я не понял.

Yorween
()
Ответ на: комментарий от sanekmihailow
#!/usr/bin/env bash

FUNC='function FN1 {
    echo "в функции"
    exit 0
}'

ssh server01 "$FUNC; FN1"

echo "после функции"

ssh server02 "$FUNC; FN1"

я хчоу чтобы при завершении функции с ошибкой команда

ssh server02 "$FUNC; FN1"
не запускалась

carter
() автор топика
Последнее исправление: carter (всего исправлений: 2)
Ответ на: комментарий от carter
#!/usr/bin/bash

function hello-ssh {
    echo "Привет из $HOSTNAME"
}

typeset -f hello-ssh | ssh user@host "$(cat); hello-ssh"

Но тут получается, что функцию-то ты передаешь по ssh, но и завершение происходит на стороне сервера. Чтобы завершить выполнение скрипта на стороне хоста придется функцию запускать локально

#!/usr/bin/bash

function hello-ssh {
    echo "Привет из $HOSTNAME"
    exit 0
}

typeset -f hello-ssh | ssh user@host "$(cat); hello-ssh"

hello-ssh

echo "До сюда не дойдет"

или завершать вне функции. Других вариантов не знаю.

Yorween
()
Последнее исправление: Yorween (всего исправлений: 2)
Ответ на: комментарий от Yorween
#!/usr/bin/bash

function hello-ssh {
    echo "Привет из $HOSTNAME"
    exit 0
}

typeset -f hello-ssh | ssh user@host01 "$(cat); hello-ssh"

typeset -f hello-ssh | ssh user@host02 "$(cat); hello-ssh"

echo "До сюда не дойдет"

дойдет

carter
() автор топика
Ответ на: комментарий от Tanger

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

Yorween
()
Последнее исправление: Yorween (всего исправлений: 1)
Ответ на: комментарий от Yorween

Тогда если серверов несколько выполнит функцию только на первом и выйдет из скрипта.

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

А я что предлагаю? Выйти из скрипта, по exit 0 в функции запущенной на другом хосте :). Не понятно правда почему у него exit 0, а не exit 1 например.

Такое - выглядит чуть более осмысленным:

typeset -f hello-ssh | ssh user@host01 "$(cat); hello-ssh" || exit 1

Tanger ★★★★★
()
Ответ на: комментарий от Tanger

У тебя получается выход из скрипта на хосте после завершения выполнения функции на сервере. Допустим, он итерирует серверы и для каждого выполняет функцию + && exit N. Тогда после первой же итерации скрипт на хосте завершится и на остальные серверах функция не выполнится.

Yorween
()

Выше фигню написали.

«exit» выходит из скрипта, «return» выходит из функции. Семантика одинаковая.

anonymous
()
Ответ на: комментарий от anonymous

Ой, это я неправильно прочитал.

exit выходит из ОДНОГО инстанса {,sub}shell'a. Глубина subshell'а содержится в переменной $BASH_SUBSHELL, глубина shell'а содержится в переменной $SHLVL.

# пустой баш
$ echo $BASH_SUBSHELL,$SHLVL
0,1
# открываем subshell с помощью command grouping ()
$ (echo $BASH_SUBSHELL, SHLVL)
1,1
# не открываем subshell с помощью command grouping {}, newline в конце - обязательно.
$ {echo $BASH_SUBSHELL,$SHLVL ;}
0,1
# открываем shell
$ bash -c 'echo $BASH_SUBSHELL,$SHLVL'
0,2
# открываем subshell внутри нового shell
$ bash -c '(echo $BASH_SUBSHELL,$SHLVL)'
1,2
# command substitution тоже открывает subshell
$ echo $(echo $BASH_SUBSHELL,$SHLVL)
1,1

Итерация exit выходит из всех уровней $BASH_SUBSHELL, затем из уровня $SHLVL, затем снова из всех $BASH_SUBSHELL, затем снова из уровня $SHLVL и так далее.

вот код

full-exit() {
for a in $(seq 1 $SHLVL); do
for b in $(seq 1 $BASH_SUBSHELL); do exit; done
[[ $SHLVL -eq 1 ]] || exit
done
}
вроде так

anonymous
()
Ответ на: комментарий от Yorween

Тогда после первой же итерации скрипт на хосте завершится и на остальные серверах функция не выполнится.

Это если ловить exit 0. Но если выходить из скрипта с ненулевым кодом возрата - можно по этому признаку выходить из всего скрипта - || exit 1

Tanger ★★★★★
()
Ответ на: комментарий от anonymous

Хотя можно ещё проще full-exit() { while [[ $BASH_SUBSHELL -gt 0 || $SHLVL -gt 1 ]]; do exit; done ;}

anonymous
()

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

carter
() автор топика
$ man bash
...
       set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...]
...
              -e      Exit  immediately  if a pipeline (which may consist of a single simple command), a list, or a
                      compound command (see SHELL GRAMMAR above), exits with a non-zero status.
anonymous
()
Ответ на: комментарий от carter

Делай, как это принято во «взрослых» ЯП — функция возвращает код («все хорошо/пропало»), а программа скрипт решает, что делать дальше (продолжаться/завершаться). Это самый простой работающий подход.

anonymous
()
Ответ на: комментарий от anonymous

Не прокатит - он же exit 0 делает)

Что ему мешает делать exit неноль?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.