sedを使用してbashデバッグ出力を編集するには? (バッシュ-x)

sedを使用してbashデバッグ出力を編集するには? (バッシュ-x)
#!/bin/bash -x
echo This is a script that has debugging turned on

スクリプト出力

+ echo This is a script that has debugging turned on
This is a script that has debugging turned on

+を削除または交換して削除したいです。私はsedが私の問題(sed 's/^\++//g')を解決すると予想しましたが、このアプローチはデバッグ出力ラインには影響しません。

もっと実験した後に発見しました。デバッグ出力がstderrに記録されているように見えます。(これを命令で推論した./test.sh 2>/dev/null後、デバッグラインを除いて出力する)

この新しい情報でこれがうまくいくことを願っています。 ./test.sh 2>&1 | sed 's/^\++//g'

しかし、残念ながら、まだ望ましくない同じ結果が表示されます。

+ echo This is a script that has debugging turned on
This is a script that has debugging turned on

答え1

これがヒント+です。PS4空の文字列に設定します。

#!/bin/bash

PS4=''
set -x

echo 'This is a script that has debugging turned on'

テスト:

$ bash script.sh
echo 'This is a script that has debugging turned on'
This is a script that has debugging turned on

または、元のスクリプトの場合は、PS4スクリプトを呼び出すときに空の文字列に設定します。

$ PS4='' ./script.sh
echo This is a script that has debugging turned on
This is a script that has debugging turned on

タイムスタンプを挿入するために使用できます。

$ PS4='$(date +"%T: ")' ./script.sh
21:08:19: echo 'This is a script that has debugging turned on'
This is a script that has debugging turned on
21:08:19: echo 'Now sleeping for 2 seconds'
Now sleeping for 2 seconds
21:08:19: sleep 2
21:08:21: echo Done
Done

答え2

あなたが直面する主な制限+は次のとおりです。拡張正規表現機能したがって、ほとんどの場合、拡張正規表現機能を有効にする必要があります。sedこれは-Eフラグに関連しています。

./test.sh 2>&1 | sed -E 's/^\++ //'

私は2つの異なる変更を適用しました。

  • デバッグコマンドが左揃えで表示されるように末尾のスペースを追加しました。
  • /g正規表現が固定されているため、1行に1つの一致のみがある可能性があるため、フラグは削除されました。

答え3

stderrをプロセス交換にリダイレクトできます。ただし、これは出力順序に影響を与える可能性があります。

$ bash -x -c 'hostname; echo "$(date)"'
+ hostname
jackmanVM
++ date
+ echo 'Tue Oct 23 15:22:02 EDT 2018'
Tue Oct 23 15:22:02 EDT 2018

$ bash -x -c 'hostname; echo "$(date)"' 2> >(sed -E 's/^\++/debug: /')
debug:  hostname
jackmanVM
debug:  date
Tue Oct 23 15:22:35 EDT 2018
debug:  echo 'Tue Oct 23 15:22:35 EDT 2018'

関連情報