2012-08-08 34 views
7

Tôi đang cố gắng này:Chụp đầu ra của thời gian bash trong biến kịch bản

TIMEFORMAT=%R; 
foo=$(time wget http://www.mysite.com) 
echo $foo 

và khi tôi thực hiện tôi thấy số tôi muốn trong đầu ra nhưng không phải trong foo biến (echo $ foo in không có gì) .

Tại sao lại như vậy?

+1

Đây là một câu hỏi thường gặp: http://mywiki.wooledge.org/BashFAQ/032 –

Trả lời

10

Bạn không chụp bất kỳ thứ gì trong footime gửi đầu ra của nó trên stderr. Vấn đề là lệnh wget cũng gửi hầu hết đầu ra của nó trên stderr. Để chia hai dòng (và vứt bỏ đầu ra từ wget), bạn sẽ cần phải sử dụng một subshell:

TIMEFORMAT=%R; 
foo=$(time (wget http://www.example.com 2>/dev/null 1>&2) 2>&1) 
echo $foo 

Dưới đây là một lời giải thích về những gì đang xảy ra ...

Phần bên trong của lệnh này :

(wget http://www.example.com 2>/dev/null 1>&2) 

Gửi cả stderrstdout-/dev/null, về cơ bản vứt đi.

Phần bên ngoài:

foo=$(time (...) 2>&1) 

Gửi stderr từ time lệnh để cùng một vị trí mà stdout được gửi để nó có thể được chụp bởi các command substitution ($()).

Cập nhật:

Nếu bạn muốn để có được thực sự thông minh, bạn có thể có đầu ra của wget qua để stderr bởi tung hứng các file descriptor như thế này:

foo=$(time (wget http://www.example.com 2>&1) 3>&1 1>&2 2>&3) 
+0

Bạn, @ lee-netherton, là một vị cứu tinh! – iGbanam

Các vấn đề liên quan