2016-04-15 8 views
0

C/C++プログラマで、スペルミスのような構文エラーが発生するとコンパイルエラーが発生するので、変数が決して宣言されていないときに、 "高レベル"それを空の文字列などに展開するだけです。Bash(および他の言語) - 宣言されていない変数のデフォルトチェックがないのはなぜですか?

シェルスクリプトでこの例のようなものを持ったときに、この

http://m.slashdot.org/story/309941

を読むこと...私の不安を確認:

rm -rf $PROJECT_ROOT/bin/* 

一つ一つの文字がそれの場所にあるかどうかを確認するために - 長い名前のシェルスクリプトのどこにでも変数名のスペルミスはありません。 それ以外の場合は、空の文字列に展開され、my/binディレクトリのすべてが削除されます。権限の設定や特定のファイル名の検索、ファイル内の何かの削除だけでなく、有効であっても

:私は確認する必要があります

[ -z "$PROJECT_ROOT" ] && exit 

、一つ一つの「危険な」変数のすべての単一のチェックはスペルミスされていないことを、そうでない場合は悪い何かが起こるかもしれません。 また、変数は、構成変数を保持するなど、別のシェルスクリプトから来ることもあります。 宣言されていない変数の使用が許可されていないと、安全ではないでしょうか?エラーをスローする:宣言されていない変数 'PROJECT_ROOT'。 C++のようなもの - 宣言されていない変数を使うことはできません。何かを宣言する必要があります。

+0

だからあなたの質問は何ですか? – JNevill

+2

http://redsymbol.net/articles/unofficial-bash-strict-mode/をチェックしたり、パラメータがヌルまたは設定されていない場合にスクリプトを終了する変数の拡張があります: '$ {parameter:?Errorメッセージ} ' –

+0

それは他の単純なことを複雑にするので。 Pythonがエラーを発生させないようにする方法は、ネイティブのアクセス構文でキーの辞書をチェックするだけでなく、inやその他のヘルパー関数を使用する必要があります。はい、それはあなたが足で自分自身を撃つことができるということも意味します。 –

答えて

2

Bashにチェックが入っています。

set -o nounset 

また、その話は、それがいくつかの理由のためにここに起こることがありませんでしemployee--後輩で私の上司に送信されました。しかし、 `set -o nounset 'はすべてのbashスクリプトが提供する関数ライブラリにあります。

私はファンではありませんが、実際には、「set -e」のような人もいます。私はすでにERRを捕まえています。

関連する問題