特定のコマンドラインフラグを$debug
次に設定するtrue
か、次のものに基づいてできる単純なデバッグスタイルを検討してください。false
$debug && echo "Something strange just happened" >&2
${debug:-false}
すべての機能を備えた-type関数など、値の設定を防ぐためのより良い方法があることを知っていますが、logMessage()
今はこれを控えておきます。
$debug
まだ設定されていないか空の悪い場合を想定してください。私は$debug && echo …
そのようなnull値が$debug
解析され、と評価され、&& echo …
後続の構文エラーが発生すると予想しました。しかし、むしろそのような評価を受けて: && echo …
最終的には実行されるようだecho
。
bash
としてksh
テストしましたが、dash
シナリオは一貫して維持されました。
私の理解は、これらの2行が等しいと解析されていますが、明らかにそうではありません。
unset debug; $debug && echo stuff
unset debug; && echo stuff
このようなエラーが原因で失敗せず、設定されていない変数が論理的に真であるかのようにコードが動作するのはなぜですかsyntax error near unexpected token `&&'
?
ベストアンサー1
ただし、拡張が完了した後は構文を確認しません。
$foo
拡張後に生成されたフィールドの数と変数の値に関係なく、構文的に有効な単純なコマンド。拡張前のシェル「単語」で十分です。
シェルが他の構文(キーワード、引用符など)も解析することを期待する拡張結果$foo && whatever
と同じです。&& whatever
まだ完了していません。
したがって:
foo="then if"
$foo
構文エラーではありませんが、次の一般的なコマンドを実行してみてくださいthen
(コマンドが存在しない可能性があり、エラーが発生しましたが、できる存在し、「コマンドが見つかりません」というエラーは次のとおりです。その他then if
1つは、単独で実行しようとしたときに発生する構文エラーです。 )。
そして:
foo=
$foo
構文エラーではありませんが、実行しようとしていますが…まあ、特別なケースである「コマンド名」がないからではなく、エラーではありません。バラより2.9.1 簡単なコマンド:
与えられた単純なコマンドを実行する必要がある場合は、コマンドテキストの最初から最後まで、次の拡張、割り当て、およびリダイレクトが行われます。
[配布、リダイレクト]
変数の割り当てやリダイレクト以外の単語は拡張する必要があります。もし拡張後もすべてのフィールドは残ります。最初のフィールドはコマンド名として扱われる必要があり、残りのフィールドはコマンドの引数です。 [...]
「if」に注意してください。
コマンド名が存在しない場合、変数の割り当ては現在の実行環境に影響し、コマンド置換がない場合は終了状態は 0 です。
したがって、$foo
空または設定されていない場合:
$foo
何もせずに終了状態を0に設定します。
bar=asdf $foo
終了状態を0$bar
に設定し、0に設定します。asdf
と同じですbar=asdf
が、$foo
didがコマンド名に拡張されている場合、割り当てはそのコマンドにのみ適用されます。