Что касается оболочки bash, я считаю, что лучший способ запомнить это - понять, что происходит.
Если все, что вы хотите сделать, это помнить, как правильно ввести команду, вы можете попробовать
program > /results 2> /results
Это хорошо и понятно, что происходит и легко запомнить. т.е.
1
STDOUT собирается /results
2
STDERR также собирается непосредственно в/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
вместе, чтобы увидеть, что на самом деле происходит - например, результат сложного процесса компиляции, перенаправляемый в файл. В этом случае я в конечном итоге