web-dev-qa-db-ja.com

ソースbashスクリプトにどのように戻りますか?

私はbashソース機能を使用して拡張するスクリプトを使用しています。

#!/bin/bash

source someneatscriptthatendsprematurely.sh

メインスクリプトを壊すことなく、そのスクリプトから戻ることができるようにしたいと思います。

Exitを使用するとメインスクリプトが中断され、returnは関数内でのみ有効であり、$(exit 1)を試しても機能しないようです。

それで、メインbashを壊すことなくサブbashスクリプトで戻ることは可能ですか?

助けてくれてありがとう!

50
codar

returnステートメントが必要です:

return [n]

nで指定された戻り値で関数を終了させます。 nを省略すると、戻りステータスは関数本体で実行された最後のコマンドのステータスになります。関数の外で使用した場合、.(ソース)コマンドによるスクリプトの実行中に、シェルはそのスクリプトの実行を停止し、nまたは最後のコマンドの終了ステータスを返します。スクリプトの終了ステータスとしてスクリプト内で実行されます。関数の外で使用され、.によるスクリプトの実行中に使用されない場合、戻りステータスはfalseです。 RETURNトラップに関連付けられているコマンドは、関数またはスクリプトの後で実行が再開される前に実行されます。

次の2つのスクリプトを使用して、この動作を確認できます。

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

script1.shを実行すると、次のように表示されます。

hello
hello again
68
paxdiablo

環境変数を変更できることが重要ですか?それ以外の場合は、ソースなしでスクリプトを実行するだけでスクリプトを実行できます。

someneatscriptthatendsprematurely.sh
1
Bart Sas

ちょうど今同じ問題がありました

たとえば、チェッカー関数を追加してそれを返すと、呼び出し元の関数も返されないことに気付きました。

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が引き続き続行されるためです。

したがって、ここで2つのことを実行できます。現在の形式(別の関数を呼び出す関数)をそのまま維持し、真の値を使用して評価し、値が真でない場合は返すか、メインのinstaller_packer_linux関数のチェッカーを書き換えます

真実:

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
}

追加しました||チェックの後に戻り、&&を使用してチェックを連結したので、両方のチェックが真でない場合は、関数を返します

0
Kenichi Shibata