$ # 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>&14>&2
$ time=$(TIMEFORMAT="%R";{ time ls 1>&32>&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'.
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:
time
; Jawaban Dennis Williamson lebih baik dalam hal itu.Lihat BashFAQ / 032 .
Waktu akan terlihat seperti "0,000" menggunakan
TIMEFORMAT="%R"
yang akan menjadi waktu "nyata".sumber
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 outputls
untuk lulus secara normal kestdout
danstderr
melalui 3 dan 4 sedangkan outputtime
(yang biasanya pergi kestderr
) diarahkan ke yang aslistdout
(1) dan kemudian ditangkap dalam variabel menggunakan substitusi perintah. Seperti yang Anda lihat pada contoh saya, nama filebar
danbaz
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:
Ada cara yang lebih mewah untuk melakukannya, tetapi itu adalah cara yang jelas / sederhana.
sumber
@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:
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 menginstalcoreutils
(brew install coreutils
) dan menggunakangdate
:sumber