Как вы возвращаетесь к исходному скрипту bash? - PullRequest
43 голосов
/ 08 сентября 2010

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

#!/bin/bash

source someneatscriptthatendsprematurely.sh

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

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

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

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

Ответы [ 3 ]

67 голосов
/ 08 сентября 2010

Вам необходим оператор return:

return [n]

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

Это можно увидеть в действии с помощью следующих двух сценариев:

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

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

hello
hello again
1 голос
/ 08 сентября 2010

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

someneatscriptthatendsprematurely.sh
0 голосов
/ 30 ноября 2017

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

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

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

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

...