Подтвердить что ты не робот

Как вы вернетесь к источнику bash script?

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

#!/bin/bash

source someneatscriptthatendsprematurely.sh

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

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

Итак, возможно ли вернуться в под- bash script без нарушения основного bash?

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

4b9b3361

Ответ 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
}

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