Що стосується панцирної оболонки, я вважаю, що найкращий спосіб запам'ятати це розуміння того, що відбувається.
Якщо все, що ви хочете зробити, це пам'ятати, як правильно виправити команду, ви можете спробувати
program > /results 2> /results
Це приємно і очевидно, що відбувається, і легко запам'ятовується. тобто
1 STDOUT збирається /results
2STDERR також збирається безпосередньо в/results
проблема полягає в тому, що це не працює так, як ви очікували. врахуйте наступне:
файл: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
і запустіть команду
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
тоді
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
що тут сталося?
Моє розуміння - це bash налаштування перенаправлення, що вказує STDERR безпосередньо на файл /tmp/resultsі через природу >якого робить 2 речі
- як правило, створити новий файл - у цьому випадку можливість минула, коли bash пройшов повз цю процедуру під час отримання результату.
- вставити прямо на початок файлу. і не додавати, як
>>це робиться.
Тож у цьому випадку STDERR вставляє безпосередньо на початок /tmp/resultsпереопределення виводу STDOUT.
Примітка: якщо ви >>додавали додавання, ви, ймовірно, могли піти з цього синтаксису.
Однак для усунення необхідної проблеми - не перенаправляти STDERR - у файл безпосередньо, а скоріше об'єднати висновок STDERR у потік STDOUT, щоб у вас не виникло зіткнення.
Використання оператора 2>&1оператора цього досягає
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
&Дозволяє Баш відрізнити від файлу з ім'ям 1і 1дескриптор файлу.
Для мене саме твердження 2>&1пояснює, що саме відбувається - STDERR переспрямовується на STDOUT сам - і закінчується лише /tmp/resultsтому, що саме там вказано STDOUT (майже як побічний ефект).
На відміну від того, що претендує багато довідників, а саме те, що 2>&1посилає STDERR туди, де колись вказано STDOUT. Якби це було правдою - у вас все одно виникне проблема перезапису.
Для отримання додаткової інформації дивіться - http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
program 1> /dev/null 2>/dev/null. Деколи, хоча вам потрібно змішатиstdoutіstderrразом, щоб побачити, що насправді відбувається - як-от вихід зі складного процесу компіляції, який переспрямовується у файл. У такому випадку я закінчую