
スクリプトを作成して から呼び出した後、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
ことでステートメントを拡張できますが、教育目的のために、より適切なアプローチがあるかどうかを知りたいです。(深くネストされたステートメントを避けたいため、スクリプトがかなり大きくなる可能性があります)else
exit
if
答え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
望んだ効果が得られます。