私のbashスクリプトでは、次のコマンドを使用して別のターミナルウィンドウでプロセスを実行しようとしています。
xterm -e /home/mohit/a.out
tee
次に、次のようにコマンドを使用して出力をリダイレクトします。
xterm -e /home/mohit/a.out 2>&1 | tee logfile
しかし、私は何も得ていませんlogfile
。手がかりはありますか、なぜこれが起こっているのですか?
xterm が新しいウィンドウを生成し、そのウィンドウで -e を実行するように見えます。そのコマンドが完了すると、終了します。
新しいシェルで開かれているため、そのウィンドウには stderr stdout などが添付されています。
そのウィンドウを開き、ログ ファイルを開いたままにしておくことが必要な場合は、xterm で実行する必要があるすべてを引用する必要があります。そうしないと、bash がリダイレクトを解釈し、それ自体をパイプします。例えば
xterm -e /home/mohit/a.out 2>&1 | tee logfile
bash によって次のように変換されます。
xterm を使用してコマンド /home/mohit/a.out を実行し、stderr を stdout にリダイレクトして、tee にパイプします。
xterm が新しい stdout などで新しいウィンドウを生成すると、ティーは入力を取得しないため、ログファイルには何もありません
試す
xterm -e '/home/mohit/a.out 2>&1 | tee logfile'
これにより、xterm がパイプ処理全体を強制的に実行します。
@peteches は、コマンド ライン全体を に指定して出力をキャプチャする方法を既に示しました-e
。
xterm
すべての出力をログファイルにキャプチャするように依頼することもできます-l
xterm -l -e /home/mohit/a.out
XtermLog.XXXXXX
またはという名前のファイルにログを記録しますXterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX
でログファイルを指定できます-lf
xterm -l -lf logfile -e /home/mohit/a.out
欠点は、これは既存のファイルでは機能しないことです。logfile
xterm が使用する前に、を削除する必要があります。