Mengarahkan output perintah waktu di unix menjadi variabel di bash?


13

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:


12

X = `(waktu ls) 2> & 1 | grep real`


Anda tidak perlu subkulit hanya untuk time; Jawaban Dennis Williamson lebih baik dalam hal itu.
musiphil

11

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".


Bisakah Anda jelaskan sedikit bagaimana ini bekerja? Saya telah menggunakan potongan seperti gaya pemujaan kargo ini selama bertahun-tahun. Apa aliran 3 dan 4? dan '-'?
Sirex

1
@Sirex: Aliran 3 dan 4 adalah aliran yang dibuat oleh execperintah 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 lsuntuk lulus secara normal ke stdoutdan stderrmelalui 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 bardan bazoutput ke terminal. ...
Dijeda sampai pemberitahuan lebih lanjut.

1
... Setelah selesai, aliran tambahan ditutup menggunakan jejak -.
Dijeda sampai pemberitahuan lebih lanjut.

4

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.


Saya tertarik melakukan ini tanpa -o. Bisakah Anda memposting salah satu metode mewah yang Anda pikirkan :)?
David Doria

0

@Dennis Williamson jawabannya bagus, tetapi tidak membantu Anda menyimpan output perintah dalam satu variabel, dan output timedalam 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 timeperintah, tetapi harus berfungsi dengan baik untuk sebagian besar skrip bash.

Sayangnya dateperintah Mac tidak mendukung %Nformat, 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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.