Linux または UNIX で Bash シェル スクリプトをデバッグする方法
メールマガジンより:
私は小さな hello world スクリプトを書きました。 Linux や Unix のようなシステムで実行されている bash シェル スクリプトをどのようにデバッグできますか。
これは、新しいシステム管理者や Linux/UNIX ユーザーが最もよく尋ねる質問です。 シェルスクリプトのデバッグは面倒な仕事です (簡単ではありません)。 シェルスクリプトをデバッグするにはさまざまな方法があります。
bash シェルに -x または -v 引数を渡して、スクリプトの各行を走査する必要があります。
Linux および Unix で実行中の bash スクリプトをさまざまな方法でデバッグする方法について見ていきます。
-x option to debug a bash shell script
-xオプションでシェルスクリプトを実行する。$ bash -x script-name
$ bash -x domains.sh
Use of set builtin command
Bashシェルにはデバッグオプションがあって、セットコマンドでON/OFFできる:
- set -x : コマンドと引数を実行中に表示する。
- set -v : シェルの入力行を読み込んで表示します。
上記2つのコマンドはシェルスクリプト自体で使用できます:
#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands
標準のShibang行を置換することができます。#!/bin/bash
を次の (デバッグ用の) コードに置き換えます:#!/bin/bash -xv
Use of intelligent DEBUG function
最初に、_DEBUG という特殊変数を追加してください。 スクリプトをデバッグする必要があるときは、_DEBUG を ‘on’ に設定します:_DEBUG="on"
次の関数をスクリプトの先頭に置きます:
function DEBUG(){ && $@}
これでデバッグが必要になったら、次のように DEBUG 関数を使用すればいいようになりました。DEBUG echo "File is $filename"
ORDEBUG set -x
Cmd1
Cmd2
DEBUG set +x
デバッグが終了したら (そしてスクリプトを実運用に移す前に) _DEBUG を ‘off’ にセットしてください。 _DEBUG="off" # set to anything but not to 'on'
サンプルスクリプト:
#!/bin/bash_DEBUG="on"function DEBUG(){ && $@} DEBUG echo 'Reading files'for i in *do grep 'something' $i > /dev/null && echo "Found in $i file"doneDEBUG set -xa=2b=3c=$(( $a + $b ))DEBUG set +xecho "$a + $b = $c"
ファイルを保存して閉じます。 次のようにスクリプトを実行します:$ ./script.sh
Output:
Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5
ここで DEBUG をオフに設定します(ファイルを編集する必要があります):_DEBUG="off"
Run script:$ ./script.sh
Output:
Found in xyz.txt file2 + 3 = 5
以上は単純ですがかなり有効な技法です。 6949>
Debugging Common Bash Shell Scripting Errors
Bash や sh、ksh は画面にさまざまなエラー メッセージを表示しますが、多くの場合、エラー メッセージには詳細な情報が含まれていないことがあります。
Skip to apply execute permission on the file
初めて hello world bash シェル スクリプトを書いたとき、次のようなエラーが表示されることがあります:bash: ./hello.sh: Permission denied
Set permission using chmod command:$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
End of file unexpected error
ファイルの終了に関するエラー メッセージを受け取った場合、スクリプトファイルを開き、開閉両方のクォートを持つことを確認します。 この例では、echo ステートメントに開始引用符がありますが、終了引用符がありません:
#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote
また、括弧と中カッコ ({}) がないことを確認します。
#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...
fi, esac, ;; などのキーワードが抜けている。
fiや;などの終了キーワードを見逃すと、「xxx unexpected」のようなエラーが発生します。 したがって、すべてのネストされた if 文と case 文が適切なキーワードで終わっていることを確認すること。 文法的な要件はbashのマニュアルを参照してください。 この例では、fi が抜けています:
#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing
Moving or editing shell script on Windows or Unix boxes
Linux/Unix上で作成しWindowsに移動しないことです。 また、Windows 10 で bash シェルスクリプトを編集し、Unix サーバーに移動/アップロードすることも問題です。 キャリッジリターン(DOS CR-LF)のため、コマンドが見つからないなどのエラーになります。 次の構文を使用して、DOS の改行 CR-LF を Unix/Linux 形式に変換できます:dos2unix my-script.sh
Tip 1 – Send Debug Message To stderr
標準エラーは、すべてのシステム エラー メッセージを書き込むために使用するデフォルト エラー出力デバイスです。
# Write error to stdoutecho "Error: file not found"## Write error to stderr (note 1>&2 at the end of echo command)#echo "Error: file not found" 1>&2
Tip 2 – vim テキストエディタを使用時に構文の強調表示を有効にする
多くの最近のテキストエディタは構文の強調表示を設定できるようになりました。 これは、構文を検出し、開始または終了引用符などの一般的なエラーを防止するのに便利です。 bash スクリプトを異なる色で表示することができます。 この機能は、シェルスクリプトの構造や構文エラーを視覚的に区別して書くことを容易にします。 ハイライトは、テキスト自体の意味には影響せず、あなたのためだけに作られます。 この例では、私の bash スクリプトに vim のシンタックスハイライトが使用されています。
Fig.01: Bash shell script syntax highlight using vim text editor
Tip 3 – Use shellcheck to lint script
ShellCheck はシェルスクリプト用のスタティック分析ツーであります。 シェルスクリプトのバグを見つけるために使用することができます。 Haskellで書かれている。 このツールでbash/shシェルスクリプトの警告と提案を見つけることができます。 シェルスクリプトを強化し、エラーを回避し、生産性を高めるために、Linux または Unix に似たシステムで ShellCheck をインストールし使用する方法を見てみましょう。
🐧 今のところ24件のコメント… 追加 ↓
Category | List of Unix and Linux commands |
---|---|
File 管理 | cat |
Firewall | Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04 – Ubuntu 16.04 |
Network Utilities | dig – host – ip – nmap |
OpenVPN | CentOS 7 – CentOS 8 – Debian 10 – Debian 8/9 – Ubuntu 18.04 – Ubuntu 20.0 |
パッケージマネージャ | apk – apt |
プロセスマネージメント | bg – chroot – cron – disown – fg – jobs – killall – kill – pidof – pstree – pwdx – time |
検索 | grep – whereis – which |
ユーザ情報 | groups – id – lastcomm – last – lid/libuser-.lid – logname – members – users – whoami – who – w |
WireGuard VPN | Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04 |