Saya hanya ingin menangkap output dari perintah waktu yaitu:
X=$(time ls)
atau
$(time ls) | grep real
Fungsi waktu meludahkannya ke konsol. Bagaimana saya melakukan ini?
Saya hanya ingin menangkap output dari perintah waktu yaitu:
X=$(time ls)
atau
$(time ls) | grep real
Fungsi waktu meludahkannya ke konsol. Bagaimana saya melakukan ini?
Jawaban:
Lihat BashFAQ / 032 .
$ # captures output of command and time
$ time=$( TIMEFORMAT="%R"; { time ls; } 2>&1 ) # note the curly braces
$ # captures the time only, passes stdout through
$ exec 3>&1 4>&2
$ time=$(TIMEFORMAT="%R"; { time ls 1>&3 2>&4; } 2>&1)
bar baz
$ exec 3>&- 4>&-
Waktu akan terlihat seperti "0,000" menggunakan TIMEFORMAT="%R"
yang akan menjadi waktu "nyata".
exec
perintah dalam jawaban saya menggunakan deskriptor file yang tersedia. Deskriptor file yang tersedia dapat digunakan. Streaming 3 dan 4 masing-masing adalah salinan 1 ( stdout
) dan 2 ( stderr
). Hal ini memungkinkan output ls
untuk lulus secara normal ke stdout
dan stderr
melalui 3 dan 4 sedangkan output time
(yang biasanya pergi ke stderr
) diarahkan ke yang asli stdout
(1) dan kemudian ditangkap dalam variabel menggunakan substitusi perintah. Seperti yang Anda lihat pada contoh saya, nama file bar
dan baz
output ke terminal. ...
-
.
Waktu menulis hasilnya ke STDERR daripada STDOUT. Yang memperburuk masalah, secara default 'waktu' adalah perintah shell builtin, jadi jika Anda mencoba 'waktu ls 2> & 1' '2> & 1' hanya berlaku untuk 'ls'.
Solusinya mungkin akan seperti:
/usr/bin/time -f 'real %e' -o OUTPUT_FILE ls > /dev/null 2>&1<br>
REALTIME=$(cat OUTPUT_FILE | cut -f 2 -d ' ')
Ada cara yang lebih mewah untuk melakukannya, tetapi itu adalah cara yang jelas / sederhana.
@Dennis Williamson jawabannya bagus, tetapi tidak membantu Anda menyimpan output perintah dalam satu variabel, dan output time
dalam variabel lain. Ini sebenarnya tidak mungkin menggunakan deskriptor file.
Jika Anda ingin merekam berapa lama program berjalan, Anda bisa melakukan ini dengan hanya mengurangi waktu mulai dari waktu selesai. Berikut ini adalah contoh sederhana yang menunjukkan berapa milidetik dari program yang dijalankan:
START_TIME=$(date +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(date +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
Ini tidak seakurat time
perintah, tetapi harus berfungsi dengan baik untuk sebagian besar skrip bash.
Sayangnya date
perintah Mac tidak mendukung %N
format, tetapi Anda dapat menginstal coreutils
( brew install coreutils
) dan menggunakan gdate
:
START_TIME=$(gdate +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(gdate +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
time
; Jawaban Dennis Williamson lebih baik dalam hal itu.