Tại sao đầu ra của một số chương trình Linux không chuyển sang STDOUT hay STDERR?
Trên thực tế, tôi muốn biết làm thế nào để nắm bắt tất cả đầu ra chương trình một cách đáng tin cậy, bất kể nó sử dụng "luồng" nào. Vấn đề tôi gặp phải là một số chương trình dường như không để đầu ra của chúng bị bắt.
Một ví dụ là lệnh 'time':
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
hoặc là
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
Tại sao tôi thấy đầu ra cả hai lần? Tôi hy vọng tất cả sẽ được dẫn vào / dev / null .
Luồng đầu ra nào đang sử dụng thời gian và làm cách nào tôi có thể chuyển nó thành một tệp?
Một cách để giải quyết vấn đề là tạo tập lệnh Bash , ví dụ, combine.sh
có chứa lệnh này:
$@ 2>&1
Sau đó, đầu ra của 'thời gian' có thể được nắm bắt theo cách chính xác:
combine.sh time sleep 1 &> /dev/null
(không thấy đầu ra - chính xác)
Có cách nào để đạt được những gì tôi muốn mà không cần sử dụng tập lệnh kết hợp riêng không?
2>&1 > /dev/null
có nghĩa là "2 bây giờ đi đến nơi 1 đi (nghĩa là thiết bị đầu cuối, theo mặc định), và sau đó 1 bây giờ chuyển sang / dev / null (nhưng 2 vẫn đi đến thiết bị đầu cuối!). sử dụng>/dev/null 2>&1
để nói "1 đi ngay bây giờ đến / dev / null, sau đó 2 đi đến nơi 1 đi (nghĩa là cũng đến / dev / null). Điều này vẫn không hoạt động ở đây vì thời gian tích hợp sẽ không được chuyển hướng, nhưng nói chung là chính xác hơn (ví dụ: nó sẽ hoạt động nếu bạn sử dụng / usr / bin / time). Hãy nghĩ về "2> & 1" khi sao chép "hướng" của 1 thành 2, chứ không phải là 2 đi 1