.bashrc で "exit" を指定して呼び出されるスクリプトによりログインが妨げられる

.bashrc で "exit" を指定して呼び出されるスクリプトによりログインが妨げられる

スクリプトを作成して から呼び出した後、root にログインできなくなってしまいました~/.bashrc

~/.bashrc:

#... do stuff then run my script
source ~/myscript.sh

~/myscript.sh:

#!/bin/bash
if [myConditional]; then
  exit
fi
# otherwise do stuff

私が期待していたのは、root としてログインすると、myscript.sh が実行され、myConditional が true であれば、myscript.sh はそれ以上のコマンドの実行を停止し、.bashrc に戻り、ユーザーは通常どおり root としてログインしたままになるというものでした。しかし、実際には、exitログインできなくなってしまいました。ログイン プロンプトに戻っただけでした。

以外に使用すべきコマンドはありますかexit? 明らかに、ステートメントを追加して を削除するifことでステートメントを拡張できますが、教育目的のために、より適切なアプローチがあるかどうかを知りたいです。(深くネストされたステートメントを避けたいため、スクリプトがかなり大きくなる可能性があります)elseexitif

答え1

source filename.sh(または. filename.sh)は、filename.sh 現在の通訳では(本質的には、その時点で内容をコピーした場合と同じです)。その結果、exitそのインタープリターが終了します。

スクリプトを別のプログラムとして実行したいだけの場合は、 を使用しないでくださいsource~/myscript.shで最初に実行可能にしておくと、 でスクリプトが実行されます。chmod +x ~/myscript.shまたは、 を使用することもできますbash ~/myscript.sh。これにより、システム上の他のプログラムと同様に、スクリプトを実行するための新しいシェルが起動します。

一方、sourceスクリプトに本当に意味がある場合(たとえば、環境変数を設定するため)、それを.bashrc実行したシェルに影響を与えることなく、ファイルの残りの部分の実行を停止することができます。使用してreturn:

return.source)組み込み関数で実行中のスクリプトの実行を終了するためにも使用でき、nまたは、スクリプト内で最後に実行されたコマンドの終了ステータスをスクリプトの終了ステータスとして返す

その場合、myscript.shファイルには次の内容が含まれます。

if [[ condition ]]
then
    return 0
fi

望んだ効果が得られます。

関連情報