私はbashソース機能を使用して拡張するスクリプトを使用しています。
#!/bin/bash
source someneatscriptthatendsprematurely.sh
メインスクリプトを壊すことなく、そのスクリプトから戻ることができるようにしたいと思います。
Exitを使用するとメインスクリプトが中断され、returnは関数内でのみ有効であり、$(exit 1)を試しても機能しないようです。
それで、メインbashを壊すことなくサブbashスクリプトで戻ることは可能ですか?
助けてくれてありがとう!
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
環境変数を変更できることが重要ですか?それ以外の場合は、ソースなしでスクリプトを実行するだけでスクリプトを実行できます。
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が引き続き続行されるためです。
したがって、ここで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
}
追加しました||チェックの後に戻り、&&を使用してチェックを連結したので、両方のチェックが真でない場合は、関数を返します