BASH構文はデバッグモードの誤動作をチェックしていますか?

NeilWang

bash -n script.shシェルスクリプトの構文を検証するために使用できますただし、この関数をテストしようとしたときに、このオプションですべての構文エラーを見つけることができないことに気付きました。

例えば:

root@ubuntu:~/testenv# cat test 
#!/bin/bash
SEND=1
if [ "$SEND" -eq 0 ]
        echo no
fi

それでは、スクリプトをテストしてみましょう。

root@ubuntu:~/testenv# bash -n test 
test: line 5: syntax error near unexpected token `fi'
test: line 5: `fi'

それはうまくいきます。ただし、ブラケットの1つを削除するだけの場合:

root@ubuntu:~/testenv# cat test     
#!/bin/bash
SEND=1
if [ "$SEND" -eq 0 
then 
        echo no
fi
root@ubuntu:~/testenv# bash -n test 
root@ubuntu:~/testenv# 

何も起こらなかった!

bashのmanページも確認しましたが、「-n」は次のように記述されています。

 -n               Read  commands  but  do not execute them.  This may be used to check a
                  shell script for  syntax  errors.   This  is  ignored  by  interactive
                  shells.

これはスクリプトファイルなので、「インタラクティブシェル」ではないでしょうか。では、どうしてこれが起こるのでしょうか?

デビッドZ

シェルが単一括弧の条件を実装する方法の非常に奇妙な癖に遭遇したと思います。これ[コマンドであり、特殊文字ではありません。システムの実行可能ディレクトリ(おそらく/usr/bin)を調べると、[このコマンドを実装する文字通りの名前の実行可能ファイルが見つかりますあなたが次のようなものを書くとき

[ "$SEND" -eq 0 ]

次に、実際には[4つの引数を使用してコマンド呼び出しています。

  1. の値 $SEND
  2. 文字列 -eq
  3. 文字列 0
  4. 文字列 ]

このコマンド[は、最後の引数が](そうでないと奇妙に見えるため)であることを確認し、残りの引数を組み合わせて条件を形成し、条件のテスト結果を返します。

[はコマンドであるため、任意の引数のセットを使用してそのコマンドを呼び出すことは構文エラーではありません。確かに、あなたは末尾をオフのままにした場合]、エラーが発生しますが、エラーがコマンドから来るでしょう[ないシェルから。つまり、エラーを取得するには、実際にスクリプトを実行する必要があります。構文チェッカーは、スクリプトに問題があることを認識しません。bashに関する限り、これ[は単なるコマンド名であり、たとえばmy_custom_conditional_test、と同じです。

my_custom_conditional_test "$SEND" -eq 0

これで問題ないことは明らかですよね?Bash[も同じように考えています。

効率を上げるために、bashは実際には実行可能ファイルを使用しないことに注意してください/usr/bin/[の独自の組み込み実装があり[ます。しかし[、シェルに組み込まれているかどうかに関係なく、人々は同じように動作すること期待しているため、Bash構文チェッカーは独自の[特別な処理を行うことができません/usr/bin/[末尾付けずに呼び出すのは構文エラー]ではないため[]。を付けずに組み込みを呼び出すのは構文エラーにはなりません

これを[[、多かれ少なかれ同じこと(条件のテスト)を行うが、シェルによって特別な意味与えられるとは対照的です。[[コマンドではなく、シェル構文の特別なトークンです。[[代わりに記述し[、対応する末尾を省略した]]場合、Bashが構文エラーについて文句を言うことになります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

アプリケーション構成内のすべてのモデルの動作をグローバルにアタッチします(継承なし)

分類Dev

私のクッキーは誤動作しています。

分類Dev

私のreadfileはデバッグモードで動作していますが、リリースモードでは動作していません。何が問題なのですか?

分類Dev

Svelteはチェックボックスバインディングをサポートしていますか?

分類Dev

Luaデバッグフックはコルーチンの動作を妨げているようです

分類Dev

WALファイルのないCoreData .sqliteバックアップを復元してWALモードで動作させることはできますか?

分類Dev

Pythonの「ForLoop」はデバッグモードで動作していますが、ターミナルから通常どおり実行している場合は動作しませんか?

分類Dev

spacemacsでグローバルにjs2モードの構文チェックを無効にする方法

分類Dev

ggplot2構文が適切な場合、R CMDチェックの「グローバル変数の表示可能なバインディングがない」というメモを処理するにはどうすればよいですか?

分類Dev

RubocopはどのようにしてRuby構文エラーを静的にチェックしますか

分類Dev

明らかなウェブトラッキングの誤動作を理解しようとしています

分類Dev

APIからトークンを取得しようとしているときのノードフェッチの誤った動作

分類Dev

他のグループがチェックされていない場合は、チェックボックスを自動的にチェックします

分類Dev

カスタムモードを使用してAceEditorに構文チェックを統合する方法は?

分類Dev

URLSessionを使用してデータをフェッチしているときに、「バックグラウンドスレッドからの変更を公開することは許可されていません」

分類Dev

Telerik UIMVVMグリッドがチェックボックスで誤動作している

分類Dev

私のVBAはデバッグモードで動作しますが、実行モードでは動作しません

分類Dev

タッチデバイスでの(まあ、モックの)ホバー動作をどのように処理しますか?

分類Dev

matlab gui では、スペースバーを押す (un) ことで、フォーカスされているチェックボックスをオンにします。この動作を無効にするにはどうすればよいですか?

分類Dev

3つのテーブルからデータをフェッチしていますが、SQL構文のエラーが発生しています

分類Dev

私の2番目のゲームオブジェクトはバックグラウンドで動作しています

分類Dev

c ++:動的割り当ての新しい演算子はメモリの安全性をチェックしますか?

分類Dev

c ++:動的割り当ての新しい演算子はメモリの安全性をチェックしますか?

分類Dev

phpcodeigniterでデバッグをチェックするための構文

分類Dev

バックグラウンドのみのCOCOAアプリを起動デーモンとして構築することの欠点は?

分類Dev

Windows は、保存されている Windows 資格情報をバックグラウンドで自動的にチェックしますか?

分類Dev

文字列の構文をチェックしています-C#

分類Dev

ForkJoinPoolのワークスチール動作を使用して、スレッド不足のデッドロックを回避できますか?

分類Dev

Rstudioデバッガーは、値がチェックされるとすぐにデバッグモードを終了します

Related 関連記事

  1. 1

    アプリケーション構成内のすべてのモデルの動作をグローバルにアタッチします(継承なし)

  2. 2

    私のクッキーは誤動作しています。

  3. 3

    私のreadfileはデバッグモードで動作していますが、リリースモードでは動作していません。何が問題なのですか?

  4. 4

    Svelteはチェックボックスバインディングをサポートしていますか?

  5. 5

    Luaデバッグフックはコルーチンの動作を妨げているようです

  6. 6

    WALファイルのないCoreData .sqliteバックアップを復元してWALモードで動作させることはできますか?

  7. 7

    Pythonの「ForLoop」はデバッグモードで動作していますが、ターミナルから通常どおり実行している場合は動作しませんか?

  8. 8

    spacemacsでグローバルにjs2モードの構文チェックを無効にする方法

  9. 9

    ggplot2構文が適切な場合、R CMDチェックの「グローバル変数の表示可能なバインディングがない」というメモを処理するにはどうすればよいですか?

  10. 10

    RubocopはどのようにしてRuby構文エラーを静的にチェックしますか

  11. 11

    明らかなウェブトラッキングの誤動作を理解しようとしています

  12. 12

    APIからトークンを取得しようとしているときのノードフェッチの誤った動作

  13. 13

    他のグループがチェックされていない場合は、チェックボックスを自動的にチェックします

  14. 14

    カスタムモードを使用してAceEditorに構文チェックを統合する方法は?

  15. 15

    URLSessionを使用してデータをフェッチしているときに、「バックグラウンドスレッドからの変更を公開することは許可されていません」

  16. 16

    Telerik UIMVVMグリッドがチェックボックスで誤動作している

  17. 17

    私のVBAはデバッグモードで動作しますが、実行モードでは動作しません

  18. 18

    タッチデバイスでの(まあ、モックの)ホバー動作をどのように処理しますか?

  19. 19

    matlab gui では、スペースバーを押す (un) ことで、フォーカスされているチェックボックスをオンにします。この動作を無効にするにはどうすればよいですか?

  20. 20

    3つのテーブルからデータをフェッチしていますが、SQL構文のエラーが発生しています

  21. 21

    私の2番目のゲームオブジェクトはバックグラウンドで動作しています

  22. 22

    c ++:動的割り当ての新しい演算子はメモリの安全性をチェックしますか?

  23. 23

    c ++:動的割り当ての新しい演算子はメモリの安全性をチェックしますか?

  24. 24

    phpcodeigniterでデバッグをチェックするための構文

  25. 25

    バックグラウンドのみのCOCOAアプリを起動デーモンとして構築することの欠点は?

  26. 26

    Windows は、保存されている Windows 資格情報をバックグラウンドで自動的にチェックしますか?

  27. 27

    文字列の構文をチェックしています-C#

  28. 28

    ForkJoinPoolのワークスチール動作を使用して、スレッド不足のデッドロックを回避できますか?

  29. 29

    Rstudioデバッガーは、値がチェックされるとすぐにデバッグモードを終了します

ホットタグ

アーカイブ