Как вы вернетесь к исходному сценарию bash?

Я использую скрипт, который расширяется с использованием функции источника bash;

#!/bin/bash source someneatscriptthatendsprematurely.sh 

Я хотел бы иметь возможность вернуться из этого сценария, не нарушая основного сценария.

Использование выходных прерываний главного сценария, возврат действителен только в функциях, и эксперимент с $ (выход 1) тоже не работает.

Итак, возможно ли вернуться в сценарий sub-bash, не нарушая основного bash?

Любая помощь ценится!

Вам нужно заявление return :

return [n]

Вызывает функцию для выхода с возвращаемым значением, заданным n . Если n опущено, то статус возврата будет последним, выполненным в теле функции. Если используется вне функции, но во время выполнения скрипта . (source), он заставляет оболочку прекратить выполнение этого сценария и вернуть либо n либо статус выхода последней команды, выполняемой в скрипте, в качестве статуса выхода скрипта. Если используется вне функции, а не во время выполнения скрипта . , статус возврата будет ложным. Любая команда, связанная с ловушкой RETURN, выполняется до того, как выполнение возобновится после функции или скрипта.

Вы можете увидеть это в действии со следующими двумя сценариями:

 script1.sh: . script2.sh echo hello again script2.sh: echo hello return echo goodbye 

Когда вы запускаете script1.sh , вы видите:

 hello hello again 

Важно ли изменять переменные среды? Поскольку в противном случае вы можете просто выполнить скрипт, выполнив его без источника:

 someneatscriptthatendsprematurely.sh 

У меня была такая же проблема только сейчас

Я понял, что добавление функции проверки и возврата, которая, к примеру, также не возвращает функцию на вызывающем абоненте.

В 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 } 

Обратите внимание, что мы добавили || вернуться после проверок и объединить проверки с помощью &&, поэтому, если обе проверки не являются правдивыми, мы возвращаем функцию

Давайте будем гением компьютера.