web-dev-qa-db-ja.com

bashスクリプトの戻り値エラー

私はこのようなbashスクリプトを持っています:

rm ~/sqoop/"$TABLE"/*
rmdir ~/sqoop/"$TABLE"
return $?

このスクリプトを実行すると、次のプロセスに値が返されますが、スクリプトが正常に実行され、スクリプトのすべてのステージが正常に実行されても、1が返されます。

これは、次のプロセスが行われていないためです。

Returnステートメントを削除すると、次のプロセスはスムーズに進みます。この問題は、Ubuntu14と新しいクラスターにUbuntu16があるHadoopクラスターのアップグラデーションの後に発生しました。

ここでreturnコマンドを削除した場合の問題と次のプロセスが正常に実行されている方法、およびReturnステートメントを削除した場合の本番環境への影響を理解するのに役立ちますか?

1
gs rao

returnステートメントは、ステートメントが関数から実行されない場合、エラーを返します。

シェル関数では、returnを使用します。スクリプトでは、exitを使用します。

次のような短いスクリプト

#!/bin/bash

return 0

エラーメッセージが表示されます

line 1: return: can only `return' from a function or sourced script

$?を1に設定します。

明示的なexitでスクリプトを終了しない場合(またはexitで終了するが、終了コードを指定しない場合)、スクリプト全体の戻りコードは同じになります。最後に実行されたコマンドとして。

exit "$?"を持つことはプレーンなexitと同じであり、スクリプトの最後にある場合、これは完全に省略できます。


一般に、スクリプトではチルダではなく$HOMEを使用することもお勧めします。これは、$HOMEが他の変数と同じように機能するのに対し、チルダは別の展開ステップで展開されるためです。つまり、チルダは変数として動作せず、引用符で囲まれた文字列では展開されません。 $HOMEもより説明的であり、スクリプトであるため、コードを読みやすくするために数回の追加のキーストロークを費やすことができます。

3
Kusalananda