Чому вихід деяких програм Linux не переходить ні на STDOUT, ні на STDERR?
Насправді, я хочу знати, як надійно зафіксувати весь вихід програми, незалежно від того, який потік він використовує. Проблема, яку я маю, полягає в тому, що деякі програми, здається, не дозволяють захопити їх вихід.
Приклад - команда 'time':
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
або
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
Чому я бачу вихід обох разів? Я очікував, що все це буде записано в / dev / null .
Який вихідний потік використовує час, і як я можу передати його у файл?
Один із способів вирішити проблему - це створити сценарій Bash , наприклад, combine.sh
що містить цю команду:
$@ 2>&1
Тоді висновок 'time' може бути записаний правильним чином:
combine.sh time sleep 1 &> /dev/null
(вихід не видно - правильний)
Чи є спосіб досягти того, що я хочу, не використовуючи окремий комбінований сценарій?
2>&1 > /dev/null
кошти «2 в даний час йде туди , де 1 йде (тобто термінал за замовчуванням), а потім 1 тепер йде / DEV / нуль (але 2 все ще йде в термінал!) використовувати.>/dev/null 2>&1
сказати "1 переходить зараз до / dev / null, потім 2 іде туди, куди йде 1 (тобто також до / dev / null). Тут все одно не буде працювати, оскільки вбудований "час" не буде переспрямовано, але, як правило, правильніше (наприклад, воно буде працювати, якщо ви використовуєте / usr / bin / time). Подумайте про "2> і 1", як про копіювання 1-го "напрямку" на 2, а не про те, що 2 буде 1