Як перенаправити stderr та stdout в різні файли в одному рядку в сценарії?


180

Я це дуже знаю:

$ command 2>> error

$ command 1>> output

Чи є якийсь спосіб я вивести stderr у файл помилок і вивести stdout у вихідний файл у тому ж рядку bash?

Відповіді:


292

Просто додайте їх в один рядок command 2>> error 1>> output

Однак зауважте, що >>це для додавання, якщо файл вже має дані. Тоді як >буде замінено всі наявні дані у файлі.

Так, command 2> error 1> output якщо ви не хочете додавати.

Просто для завершення ви можете записати 1>так само, >оскільки вихідним дескриптором файлів є вихід. так 1>і >те саме.

Отже, command 2> error 1> outputстає,command 2> error > output


3
Чудова відповідь! Мені дуже подобається ваше пояснення того, як 1>можна записати як>
user784637

Чим це відрізняється від подібного command &2>err.log, я думаю, що я абсолютно заплутаний синтаксисом. (Посилання на відповідну відповідь на всі баш-труби може бути в порядку)
ThorSummoner

4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html - це те, що я думаю, що ви шукаєте. Fwiw, схоже command &2>err.log, не зовсім законний - амперсанд у цьому синтаксисі використовується для дескриптора файлів як цільового, наприклад command 1>&2, перенаправить stdout в stderr.
DreadPirateShawn

@DreadPirateShawn, будь ласка, не пов'язуйте АБС як посилання - він періодично містить відверті неточності і дуже часто містить приклади поганої практики. wiki.bash-hackers.org/howto/redirection_tutorial є набагато кращим джерелом перенаправлення.
Чарльз Даффі

27

Спробуйте це:

your_command 2>stderr.log 1>stdout.log

Більше інформації

Цифри 0наскрізь 9є дескрипторами файлів у bash. 0означає стандартний вхід, 1означає стандартний вихід, 2означає стандартну помилку. 3через 9запасні для будь-якого іншого тимчасового використання.

Будь-який дескриптор файлу може бути переспрямований у файл або до іншого дескриптора файлів за допомогою оператора >. Ви можете замість цього використовувати оператора>> створення порожнього для додавання до файлу.

Використання:

file_descriptor > filename

file_descriptor > &file_descriptor

Будь ласка, зверніться до Розширеного посібника з сценаріїв Bash: Розділ 20. Перенаправлення вводу / виводу .


Thanks.i шукав це протягом години
dılo sürücü


9

Або якщо ви хочете змішати результати (stdout & stderr) в одному файлі, який ви можете використовувати:

command > merged-output.txt 2>&1

32
Це не відповідь на запитання.
Маттіас

Чому люди об'єднують результати або пропонують об'єднати результати?
Нуреттін

@nurettin: можливо, у вас є рядок сценарію, який просто виконує команду і миттєво зберігає вихід у файл журналу. Команда, про яку йдеться, може іноді провалюватися, тому ви хочете зберегти помилки щодо цього, але в тому ж файлі журналу.
streamofstars

@streamofstars так, звичайно, ви праві, можливо, іноді саме цього хочуть люди, я коментував в контексті цього питання як хтось, хто шукав відповіді і знаходив багато невідповідних у всьому стачному потоці.
Нуреттін

0

Вихід декількох команд може бути перенаправлений. Це працює як в командному рядку, так і найбільш корисно в скрипті bash. -sНаправляє запит на введення пароля на екрані.

Hereblock cmds stdout / stderr надсилаються окремим файлам і нічого не відображаються.

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Hereblock cmds stdout / stderr надсилаються в один файл і відображаються.

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Hereblock cmds stdout / stderr надсилаються до окремих файлів, а stdout - для відображення.

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

Залежно від того, хто ви (whoami) та ім'я користувача, пароль може бути, а може і не потрібно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.