web-dev-qa-db-ja.com

端末の出力をtxtファイルに保存する

配信のために、プログラムの完全な出力をtxtファイルに出力するようにアドバイスされています。また、実行スクリプトに実装したコマンド「time」を使用して実行時間を出力する必要があります。

#!/bin/bash
time ./blur-effect 4k.png 4k_out16.png 16 15 &>> Output.txt 

私が抱えている問題は、プログラムの出力がtxtファイルに正しく送られることですが、実行時間はターミナルに表示されていますが、事前にヒントやヘルプをありがとう、txtファイルにも出力する必要があります。

5
mraz

コマンドグループまたはサブシェルでコマンドをラップする場合は、希望どおりに機能するはずです。

{ time ./blur-effect 4k.png 4k_out16.png 16 15 ; } &>> Output.txt 

または

(time ./blur-effect 4k.png 4k_out16.png 16 15) &>> Output.txt 

参照 timeの出力をファイルに書き込む。なぜ括弧が必要なのか?

13
steeldriver

Bashでは、timeパイプラインのシェルキーワード であり、ストリームのリダイレクトを解釈して、時限コマンド(パイプライン)でのみ発生するようにします。また、よくある* nixユーティリティプログラムでもあります。

$ type -a time
time is a Shell keyword
time is /usr/bin/time

timeとの間でストリームをリダイレクトしたい場合は、 steeldriverの回答で説明されているコマンドグループまたはサブシェル を使用するか、 time(1)を呼び出します。 ユーティリティプログラムを明示的に:

/usr/bin/time COMMAND... &> LOGFILE

または、timeの完全なパスがわからない場合

time="$(which time)"
"$time" COMMAND... &> LOGFILE

PS:time(1)コマンドの出力を、コマンドの標準エラー出力(デフォルト)に接続されていないファイルに保存できます。これにより、時限プログラムの標準エラー出力を、 -oオプション。 -aは、ファイルを上書きする代わりに、timeをそのファイルに追加します。

/usr/bin/time [-a] -o time.log COMMAND... >command-stdout.log 2>command-stderr.log

Wordのtimeシェルキーで同じ効果を得るには(通常、上書きする代わりに>>リダイレクトの代わりに>を使用して追加します):

{ time COMMAND... >command-stdout.log 2>command-stderr.log; } 2>time.log

または、時間ログを保存し、時間指定プログラムの標準エラー出力はそのままにしておきます。

{ time COMMAND... 2>&3; } 3>&2 2>time.log
5
David Foerster