次のbashスクリプトがあります。
rm ~/sqoop/"$TABLE"/*
rmdir ~/sqoop/"$TABLE"
return $?
このスクリプトを実行した後、次のプロセスに値を返しますが、スクリプトが正常に実行され、スクリプトのすべてのステップが正常に完了しても1を返します。
これにより、次のプロセスは発生しません。
return ステートメントを削除すると、残りのプロセスが円滑に進行します。この問題は、Ubuntu 14を搭載したHadoopクラスタとUbuntu 16を持つ新しいクラスタをアップグレードした後に発生しました。
ここでreturnコマンドを削除すると問題が何であるか、次のプロセスがどのように正常に実行されるのか、returnステートメントを削除すると、本番環境にどのような影響があるのかを理解できますか?
答え1
return
文が関数またはドットスクリプト(ソーススクリプト)で実行されない場合、文はエラーを返します。
シェル関数とドットスクリプトではを使用しますreturn
。exit
次のような短いスクリプト
#!/bin/bash
return 0
エラーメッセージが生成されます
line 1: return: can only `return' from a function or sourced script
$?
そして1に設定します。
スクリプトを明示的に終了しない場合exit
(または終了コードを指定せずに終了する場合exit
)、スクリプト全体の戻りコードは最後に実行されたコマンドと同じです。
have はexit "$?"
plain と同じexit
で、スクリプトの最後にあれば完全に省略できます。
$HOME
通常、スクリプトではチルダの代わりにチルダを使用することをお勧めします。$HOME
チルダは別の拡張フェーズで拡張されますが、チルダは他の変数のように機能するためです。つまり、変数として機能せず、引用符付き文字列内では拡張されません。$HOME
また、より説明的でスクリプトなので、いくつかの追加のキーストロークを使用してコードを読みやすくすることができます。