пятница, 8 сентября 2017 г.

Что значат символы >> и >& в unix/Linux

> перенаправляет вывод в файл, перезаписывая его

>> перенаправляет вывод в файл, но не перезаписывает его, а добавляет в конец

Standard output is represented in bash with number 1 and standard error is represented with number 2. They are separate, so the user can redirect them to different files.

2>&1 redirects the standard error to the standard output so they appear together and can be jointly redirected to a file. (Writing just 2>1 would redirect the standard error to a file called "1", not to standard output.) © stackexchange

Стандартный вывод в bash-е обозначается цифрой 1, а ошибки — цифрой 2.

Команда 2>&1 перенаправляет вывод ошибок в STDOUT. Они и так обычно туда направляются, но так надежнее ツ

Команда 2>1 запишет текст ошибки в файл "1", поэтому нам нужен знак амперсанда, если мы имеем в виду именно поток.

Посмотрим на примере. Перейдем в Cygwin в любую существующую директорию, а потом попробуем удалить некий файл example.txt, которого на самом деле там нет → система выведет ошибку «файла не существует».


Переходим в новую директорию

$ cd D:\test

$  rm example.txt 2>1.txt
Создан файл 1.txt, туда записан текст ошибки

$  rm example.txt 2>1.txt
Повторяем команду. В файле все еще одна строка с сообщением об ошибке, так как файл был перезаписан

$  rm example.txt 2>>1.txt
А вот теперь в файле уже две строки с сообщением об ошибке, так как файл не перезаписан, к нему в конец добавлено новое сообщение

$  rm example.txt 2>&1 >>1.txt
rm: невозможно удалить «example.txt»: No such file or directory
Сообщение об ошибке одновременно выведено в STDOUT и добавлено в файл

Если мы пишем скрипт автоматизации, там может встретиться такая строка:

hg pull 2>&1 >> /dev/null

Что это значит? Мы выполняем команду «hg pull».
Если возникают ошибки, выводим их в консоль (2>&1) и записываем в файл /dev/null → это мы делаем для того, чтобы ошибка не остановила сам скрипт. Ведь запись в  /dev/null всегда завершается успешно, что бы мы туда не пихали.

См также:

what is >> symbol and >& in unix/Linux? — в ответах как раз описание понятное, что означают символы
Что означает "> /dev/null 2>&1"? — статья с хабра о перенаправлениях вывода
Потоки данных — еще одна полезная статья с хабра
Стандартные потоки — куда ж без википедии
/dev/null — снова википедия

Комментариев нет:

Отправить комментарий