Bạn không chụp bất kỳ thứ gì trong foo
vì time
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ả stderr
và stdout
-/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)
Nguồn
2012-08-08 16:29:09
Đây là một câu hỏi thường gặp: http://mywiki.wooledge.org/BashFAQ/032 –