エコーとログを使用せずにbashスクリプトをデバッグする方法はありますか?
私はブレークポイントとそのようなものの使用について話している。
はい、 Bash Debugger Project があります。
実行時にset -x
およびset -v
を使用することもできます。詳細:
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/debugging.htmlhttp://www.cyberciti.biz/tips/debugging-Shell-script.html
幸運を!
いくつかの異なる方法があります、すなわち:
-xオプションを使用してスクリプトを実行します
bash -x yourscript.sh
set -x
は、スクリプトファイルの先頭のShebang #!/bin/bash
の後、スクリプトの開始前に新しい行にset -v
を追加し、シェルの入力行を表示し、set -x
を表示します実行されたコマンドと引数
スクリプトファイルのShebangを#!/bin/bash -xv
に置き換えます
現在、 Visual Studio Code Bashデバッグ拡張機能 があります。 「ステップイン/アウト/オーバー」があり、各変数の値を表示できます。
shellcheckは町で最高です-
また、vimと統合することもできます。これがgitリポジトリです。
この小さな関数を使用して、「コンソール」にドロップできます。
function debug
{
echo "#############| Entering DEBUG mode |####################";
CMD=""
while [[ $CMD != "exit" ]]; do
read -p "> " CMD
case $CMD in
vars ) ( set -o posix ; set );;
exit ) ;;
* ) eval $CMD;;
esac
done
echo "#############| End of DEBUG mode |####################";
}
次に、スクリプト内で(例):
for FILE in *; do
...
if [[ $FILE == "strange_case.txt" ]]; then
# break the code here to analyze:
debug
fi
...
done
ローカル変数をそのままにして、コマンドを受け入れます。 「デバッグ」モードを終了するには、「exit」と入力し(スクリプトを終了しません)、コードを続行します。ループ内で「デバッグ」を使用すると、毎回停止します。 (上記の例のように)「if」で囲むか、「ウォッチ」関数を作成できます。
function debug_watch
{
if [[ $1 == $2 ]]; then
debug
fi
}
# And Use it:
debug_watch $FILE "strange_case.txt"
また、使用可能なすべての変数とその値をダンプする「vars」コマンドも追加しました。独自のカスタマイズされたコマンドも追加できます。
数分でコードを作成したので、自己責任で使用してください。デバッグモードでは任意のコマンドを実行できるため、本番スクリプトに残すとセキュリティ上のリスクが生じることに注意してください。
NESが言っていることに合わせて、bashにデバッグ用のフラグを設定します。
set -x
フラグは、ターミナルまたはスクリプト内から設定および設定解除できます。 +
または-
の使用:
#!/bin/bash
#fileinfo
ls -l $1
set -x # start debugging here
wc -l $1
set +x # stop debugging here
file $1
set -v # start verbose output
w | more
echo ""
echo -n "Number of users: "
set +v # end verbose output
who | wc -l
set
コマンドの機能は次のとおりです。
set -f
メタキャラクターを使用したファイル名の生成を無効にします。set -v
読み取られたとおりに(詳細)シェル入力行を出力します。set -x
コマンドを実行する前にコマンドトレースを出力します。set
には実際には多くの機能がありますが、シェル組み込みツールであるためマンページはありません。セットのマニュアルは GNU Bash documentation にあります。
次のようなプログラムの詳細を取得するのに役立つコマンドラインツールが多数あります。
stat
ファイルまたはファイルシステムのステータスを表示file
はファイルタイプを決定します。hexdump
フィルターは、指定されたファイルをさまざまな形式で表示しますNohup
ハングしないスクリプトを実行する
その他多数。私は隠されたキャラクターを表示するコマンドを考えていましたが、今はできません。 Hexdumpはそれを行いますが、より良いものがあります。
キーコマンド ctrl\ 実行中のプログラムまたはスクリプトのコアダンプが発生します。その後、コアダンプを分析できます。おそらくgdbを使用してコアダンプを分析しますが、そのための多くのプログラムがあります。
Bashシェルには、デバッグ用の優れたオプションもいくつかあります。 options --debugger
、-v
verbose、--dump-strings
、およびその他の便利なオプション。 man bash
を使用してチェックアウトします。
trap
コマンド(組み込みのシェル)は非常に役立つ場合があります。トラップは、プログラムが予期せず終了した場合、何かを実行します。トラップ、およびその他の便利なBash Shellビルトインについて読みます here 。
今のところ一般的に言えば、デバッグはどの言語でも大きなトピックです。プログラミング言語でのデバッグに役立つ他のトピックには、シェルリダイレクトと信号処理が含まれます。
最後に、私が使用した例は些細なものであることに気づきましたが、シェルスクリプトの中には数百行に及ぶものもあります。そのような状況では、コメントタグを挿入し、問題があると思われるコードをブロックするか、あるいは、終了コマンドを挿入し、分割統治手法を使用して、破損したコードから機能コードを分離しようとします。
BashスクリプトをデバッグするためのGUIオプションは、BashEclipse/Shelledプラグインを備えたEclipse IDEです。
これにより、質問の機能(breakpoints and stuff
)と、複雑なbashスクリプトをデバッグするための他の機能のホストが提供されます。
次の機能が含まれます。
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )
使用する手順は、Shelled
およびBashEclipse
プラグインをEclipseに追加することです。次に、BashEclipse read meテキストファイルで提供されている手順を実行して、デバッガーを起動します。