Как вы вернетесь к источнику bash script?
Я использую script, который расширяется с помощью функции источника bash;
#!/bin/bash
source someneatscriptthatendsprematurely.sh
Я хотел бы иметь возможность вернуться из этого script, не нарушая основной script.
Используя выходные разрывы, главный script, возврат действителен только в функциях, и эксперимент с $(выход 1) тоже не работает.
Итак, возможно ли вернуться в под- bash script без нарушения основного bash?
Любая помощь оценивается!
Ответы
Ответ 1
Вам понадобится инструкция return
:
return [n]
Вызывает функцию для выхода с возвращаемым значением, указанным n
. Если n
опущено, статус возврата - это последний из команд, выполняемых в теле функции. Если используется вне функции, но во время выполнения script командой .
(source), она заставляет оболочку прекратить выполнение этого script и вернуть либо n
, либо статус выхода последней выполненной команды в пределах script в качестве статуса выхода script. Если используется вне функции, а не во время выполнения script на .
, статус возврата является ложным. Любая команда, связанная с ловушкой RETURN, выполняется до того, как выполнение возобновится после функции или script.
Вы можете увидеть это в действии со следующими двумя сценариями:
script1.sh:
. script2.sh
echo hello again
script2.sh:
echo hello
return
echo goodbye
Когда вы запустите script1.sh
, вы увидите:
hello
hello again
Ответ 2
Важно ли изменять переменные среды? Поскольку в противном случае вы можете просто выполнить script, выполнив его без источника:
someneatscriptthatendsprematurely.sh
Ответ 3
У меня была такая же проблема только сейчас
Я понял, что добавление функции проверки и возврата, которая, к примеру, также не возвращает функцию на вызывающем абоненте.
В bash_functions
function install_packer_linux() {
check_wget && check_unzip
wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip
unzip packer_1.1.2_linux_amd64.zip
mv packer ~/.local/bin
rm -f packer_1.1.2_linux_amd64.zip
}
function check_unzip() {
if ! [ -x "$(command -v unzip)" ]; then
echo "Error: unzip is not installed"
return 1
else
return 0
fi
}
function check_wget() {
if ! [ -x "$(command -v wget)" ]; then
echo "Error!: wget is not installed"
return 1
else
return 0
fi
}
$ source ~/.bash_functions
Что происходит здесь, так как шашки - это единственное место, которое было возвращено, поэтому install_packer_linux все равно продолжит
Итак, вы можете сделать две вещи здесь. Либо сохраните текущий формат (функцию, вызывающую другую функцию), как есть, и оцените с помощью правдивого значения, затем верните, если значения не являются правдивыми или перепишите проверку на главную функцию installer_packer_linux.
Truthy:
function install_packer_linux() {
check_wget && check_unzip || return
wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip
unzip packer_1.1.2_linux_amd64.zip
mv packer ~/.local/bin
rm -f packer_1.1.2_linux_amd64.zip
}
Обратите внимание, что мы добавили || возвращать после проверок и конкатенировать проверки с использованием && &
поэтому, если обе проверки не являются правдивыми, мы возвращаем функцию