
stdout と stderr をファイルにリダイレクトする単一のスクリプトの場合:
./myscript.sh 2>&1 | tee -a out_file
問題なく動作します。同じ方法で複数のダイアログボックスを含むスクリプトを実行しようとすると、ダイアログコマンド(および他のスクリプトの呼び出し)
./main.sh 2>&1 | tee -a out_file
これらのボックスが原因で、out_file に不要な文字が含まれます。例:
#!/bin/bash
# myscript.sh
dialog --title "Title" \
--msgbox "Message Box" \
30 120
date
生成する:
$ ./myscript.sh 2>&1 | tee -a myscript.out
これに似た複数の行:
[36m[44m [30m[40m[K[22;38H[39;49m(B[m[2;3H[30m[47mMessage Box[22;38H[39;49m(B[m
これらの文字を除いたstdoutとstderrを取得するにはどうすればよいでしょうか(メインスクリプトとそれ以降のすべてのスクリプト用)。これは、例の出力のようになります。日付ユーザーが入力ボックスに入力した内容がわかると便利です。
答え1
色分けされた出力をファイルに記録しようとしています。bash での色とフォーマットを参照してください。https://misc.flogisoft.com/bash/tip_colors_and_formatting
この場合、stdout を任意に変更することはできません。ログ用に stdout を最適化すると、ユーザーが見る出力も変更されるためです。
しかし、いくつかの可能性があります:
最も簡単な方法は、myscript.sh にコマンドを追加して
echo "Message Box printed" >> myscript.out
、いくつかのアクションをファイルに直接記録することです。試して
./myscript.sh 2>&1 | sed -e "s/<your regex>//g" | tee -a myscript.out
置き換えてみてください<your regex>
。しかし、これによって出力も変更されます。したがって、それはあなたが探しているものではないと思います。または、myscript.shで独自の記述子を作成し
echo "Exit code: $? Textbox $usertext" 1>&4
、ダイアログコマンドを次のように変更しますusertext=$(dialog --title "Title" --inputbox "Enter your text:" 30 120 "My Text" 3>&1 1>&2 2>&3)
。. myscript.sh 4>> myscript.out