2012-01-31 11 views
63

bash -xオプションを入力すると、すべての行が表示されます。しかし、スクリプトは正常に実行されます。どのように行ごとにbashスクリプトを実行しますか?

行ごとにどのように実行できますか?私はそれが正しいことをするかどうかを見ることができます、または私はバグを中止し、修正します。同じ効果がすべての行にreadと置かれます。

+0

おそらく、より広くも参照https://stackoverflow.com/questions/951336/how-to-debug-a-bash-script/45096876#45096876 – tripleee

答えて

87

everylineで読み込みをする必要はありません。次のようなトラップをbashスクリプトに追加するだけで、必要な効果が得られます。

#!/usr/bin/env bash 
set -x 
trap read debug 

< YOUR CODE HERE > 

bash v4.2.8およびv3.2.25で動作確認済みです。


改良版

スクリプトファイルからコンテンツを読んでいる場合は、上記では動作しません。回避策は次の例のようになります。

#!/usr/bin/env bash 
echo "Press CTRL+C to proceed." 
trap "pkill -f 'sleep 1h'" INT 
trap "set +x ; sleep 1h ; set -x" DEBUG 

< YOUR CODE HERE > 

あなたはこの場合、別のシェルからそれを殺すために必要がありますスクリプトを停止します。


あなたは、単にあなたのために働く可能性があり、スクリプトで次のコマンドに次の例を進める前に、数秒を待ちたい場合ALTERNATIVE1。

#!/usr/bin/env bash 
trap "set +x; sleep 5; set -x" DEBUG 

< YOUR CODE HERE > 

出力をより読みやすくするために、トラップコマンドにset + xと-xを追加します。

+1

次に、次の行に進む(次のコマンドを実行する)のですか? –

+2

すべてのコマンドで読み取りをトラップします。あなたがする必要があるのは、次のコマンドに戻るためにreturnキーを押すことだけです。 –

+0

別のシェルを使用したい場合は、kshでも動作します。 – ChrisGer

10

多分BASH Debuggerはあなたのためのものです。

+1

これは本当に最高のソリューションです。それは実行される前に行を見ることができます(そしてはるかに多く)。ほとんどのシステムでは、 'apt-get install bashdb'でインストールすることができます。次に 'bashdb your_command.sh'を実行し、' step'と打ち込み、その後に復帰する必要があります。 – studgeek

+0

@studgeekそれはRedhat/CentOSなどでは利用できないので、私はその "ほとんどのシステム"と呼んでいません。 – Sajuuk

0

bashスクリプトが実際に1つずつ実行したいオフコマンドの束である場合、あなたは変数をインクリメントするときに各コマンドを1つずつ実行するこのようなことを行うことができますあなたが走りたい番号。これにより、最後のコマンドを再び簡単に実行することができます。次に、次のコマンドに進むために変数をインクリメントします。

あなたのコマンドが "it.sh"というファイルであると仮定して、次のコマンドを1つずつ実行します。

$ cat it.sh 
echo "hi there" 
date 
ls -la /etc/passwd 

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1) 
"hi there" 

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1) 
Wed Feb 28 10:58:52 AST 2018 

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1) 
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd 
関連する問題