Bash: поведение перенаправлений - PullRequest
0 голосов
/ 02 марта 2020

Вопрос

Пожалуйста, подтвердите, если мои представления верны. Или исправьте, если неправильно и указатели на соответствующие технические статьи и документы будут оценены.


Они делают то же самое.

  1. ls &>/tmp/01.log

  2. ls 2>&1 >/tmp/02.log

  3. ls > /tmp/03.log 2>&1

  4. ls 2>&1 1>/tmp/04.log


Результат 5 будет таким же, как 1-4, на одноядерном процессоре, где в процессе не будет нескольких потоков выполнения. Если это может привести к другому результату, пожалуйста, помогите понять, что на самом деле происходит в каждом процессе и в ядре.

Для среды с многоядерными процессорами может случиться так, что когда поток в ядре пишет в стандартный вывод другой поток на другом ядре пишет в stderr, и они могут чередоваться?

ls 1>/tmp/05.log 2>/tmp/05.log

Ниже могут возникнуть ошибки, например, stderr пытается записать, но stdout еще ничего не выводит.

ls 1>/tmp/05.log 2>>/tmp/05.log

То же самое с 1 по 4 .

ls 1<&2 > /tmp/06.log

Результат тот же, что и с 1 по 4, хотя делать это бессмысленно.

ls 2>&1 | cat<&0>&1 > /tmp/07.log

Исследования

1 Ответ

1 голос
/ 02 марта 2020

Номер 4 отличается. Порядок имеет значение: сначала FD 2 перенаправляется туда, где FD 1 в настоящее время указывает (по умолчанию на терминал, если другое перенаправление не было установлено уже в этом процессе или родительским процессом), а затем FD 1 перенаправляется в файл.

...