GNU/Linux >> Linux の 問題 >  >> Linux

bashスクリプトを終了する方法はありますが、ターミナルを終了しない

はい; return を使用できます exit の代わりに .その主な目的はシェル関数から戻ることですが、 source 内で使用すると -d script、そのスクリプトから戻ります。

Bash Reference Manual の §4.1「Bourne Shell Builtins」として つまり:

     return [n]

シェル関数を戻り値 n で終了させる .If n が指定されていない場合、戻り値は関数で実行された最後のコマンドの終了ステータスです。これは、実行中のスクリプトの実行を . で終了するためにも使用できます。 (または source ) 組み込み、n のいずれかを返す または、スクリプト内で実行された最後のコマンドの終了ステータスを、スクリプトの終了ステータスとして指定します。 RETURN に関連付けられたコマンド トラップは、関数またはスクリプトの後で実行が再開される前に実行されます。return の場合、戻りステータスはゼロ以外です。 . によるスクリプトの実行中ではなく、関数の外で使用されます または source .


. run2.sh を使用してスクリプトを実行する代わりに 、 sh run2.sh を使用して実行できます または bash run2.sh

スクリプトを実行するために新しいサブシェルが開始され、スクリプトの最後でサブシェルが閉じられ、他のシェルは開いたままになります。


「問題」は、スクリプトを実行していないことです。ファイルをソースすると、サブシェルを生成する代わりに、その内容が現在のシェルで実行されます。したがって、exit を含むすべてが現在のシェルに影響します。

exit を使用する代わりに 、 return を使用する必要があります .


return ステートメント/コマンドの後に追加の終了コマンドを追加して、コマンド ラインからのスクリプトの実行とターミナルからのソースの両方で機能するようにすることができます。

スクリプトの終了コードの例:

   if [ $# -lt 2 ]; then
     echo "Needs at least two arguments"
     return 1 2>/dev/null
     exit 1
   fi

exit のある行 return の後にスクリプトをソースすると、コマンドは呼び出されません コマンド。

スクリプトを実行すると、 return コマンドでエラーが発生します。そのため、エラー メッセージを /dev/null に転送して抑制します。 .


Linux
  1. スクリプトは実行可能であるが読み取り可能ではありませんか?

  2. Bash Echoコマンドライン自体で実行されるコマンドライン(スクリプトではない)?

  3. サービスがスクリプトで実行されているかどうかをテストする「適切な」方法は?

  1. ターミナルでループバッシュスクリプトを停止する方法は?

  2. 実行後にBashスクリプトが終了しないのはなぜですか?

  3. これが「読み取り中」にターミナルで機能するのに、シェルスクリプトでは機能しないのはなぜですか?

  1. bashでループの終了ステータスを取得する方法

  2. TERM 環境変数が設定されていません

  3. Bash スクリプトでエラーを発生させる