я знаю что
program > /dev/null 2>&1
делает. Он перенаправляет вывод в /dev/null
и 2>&1
означает перенаправить вывод ошибки в том же месте, куда отправляется вывод.
Моя проблема в том, что мне всегда приходится гуглить, потому что я никогда этого не помню.
Итак, я стараюсь &2>1
, 1>2&
, 1>&2
... Я стараюсь каждую комбинацию , пока я не Google это ...
Какой трюк, чтобы запомнить это легко?
program 1> /dev/null 2>/dev/null
. Хотя иногда вам нужно смешиватьstdout
иstderr
вместе, чтобы увидеть, что на самом деле происходит - например, результат сложного процесса компиляции, перенаправляемый в файл. В этом случае я в конечном итогеОтветы:
Вывод лучше, чем ошибка, поэтому он идет первым (1 против 2).
>
это сокращение от «идет к». Слева - то, что я хочу отправить, а справа - то, куда я хочу это отправить. Поскольку «где» - это (почти) всегда файл, что-то вродебудет перенаправлять в файл с именем 1. Таким образом, амперсанд
(&)
изменяет файл в дескриптор файла.К сожалению, я не сталкивался и не разработал свою собственную мнемонику, но когда я впервые изучил * nix, я нашел этот логичный способ хорошо работать. После нескольких прогонов он становится второй натурой.
источник
stdout
это файловый дескриптор 1,stderr
равен 2. Итак, «ошибка» предшествует «выводу».stdout
иstderr
ссылки.Один трюк состоит в том, чтобы просто помнить, что 1 = стандартный вывод, 2 = стандартная ошибка. Так:
2>&1
= стандартный поток ошибок входит в стандартный поток вывода.1>&2
= наоборотЕсли вы когда-либо программировали на C-подобном языке, легко запомнить амперсанд (
&
). Я предпочитаю думать об этом как об «адресе» существующего дескриптора файла, чтобы вы не меняли сам файл или не создавали новый.источник
Видя ,
&
как узел может помочь: думать о том, что вы хотите сделать , как принимать выход 2, так2>
и связывая его с 1, так2>&1
источник
На самом деле, это зависит от того, какую оболочку вы используете. Баш обычно очень простителен, и вы можете просто сделать:
источник
Давайте рассмотрим эти три варианта:
Первый отправляет stderr в файл с именами «1»: в конце концов, bash ожидает перенаправления в файл.
Второй также перенаправляет в тот же файл, но работает
program
в фоновом режиме: это то, что&
должен означать трейлинг .Это оставляет третью возможность как единственную, которая имеет смысл во вселенной bash для перенаправления на дескриптор файла.
Как запомнить какой есть какой из 0, 1, 2? Подумайте о запуске компьютера из консоли. Во-первых, вы должны набрать что-то (0 = стандартный ввод). Затем вы видите вывод (1 = стандартный вывод). Наконец, и только если что-то пойдет не так, вы увидите stderr (2).
источник
Нарисуй это в своих обоях.
Теперь, если серьезно, об этом и других базовых вещах я постоянно забывал, поэтому я добавил меню быстрых советов в приложение, которое я разработал и которое я использую ежедневно. Возможно, вы захотите попробовать или использовать что-то вроде gnote, чтобы сохранить заметку.
источник
Что касается оболочки bash, я считаю, что лучший способ запомнить это - понять, что происходит.
Если все, что вы хотите сделать, это помнить, как правильно ввести команду, вы можете попробовать
Это хорошо и понятно, что происходит и легко запомнить. т.е.
1
STDOUT собирается/results
2
STDERR также собирается непосредственно в/results
проблема в том, что это не работает так, как вы ожидаете. учитывать следующее:
файл:
/tmp/poem.txt
и запустить команду
тогда
что здесь случилось?
Насколько я понимаю, bash настраивает перенаправление, указывающее STDERR непосредственно на файл,
/tmp/results
и из-за характера,>
который делает 2 вещи>>
делает.Таким образом, в этом случае STDERR вставляет непосредственно в начало
/tmp/results
переопределения вывода STDOUT.Примечание: если вы использовали
>>
для добавления, вы, вероятно, могли бы сойти с этого синтаксиса.Однако, чтобы решить проблему, вам нужно - не перенаправлять STDERR - непосредственно в файл, а объединить вывод STDERR в поток STDOUT, чтобы избежать коллизии.
Использование оператора
2>&1
оператор достигает этого&
Позволяет Баш отличить от файла с именем1
и1
дескриптор файла.Для меня само утверждение
2>&1
точно объясняет, что происходит - STDERR перенаправляется на сам STDOUT - и заканчивается только/tmp/results
потому, что именно на него указывает STDOUT (почти как побочный эффект).В отличие от того, что утверждают многие из руководств, то есть
2>&1
отправляет STDERR туда, куда направлен STDOUT. Если бы это было правдой - у вас все равно была бы проблема с перезаписью.Для получения дополнительной информации см. Http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection.
источник