если несколько операторов перенаправления в одной команде. (баш)
тот же оператор перенаправления.
Пример arg_1 > arg_2 > arg_3 > arg_4
другой оператор перенаправления.
Пример arg_1 < arg_2 > arg_3 < arg_4 < arg_5 > arg_6
я знаю, работает ли один оператор перенаправления в команде.
но если несколько операторов перенаправления в одной командной строке, как это работает?
Некоторые оболочки рассматривают конфликтующие перенаправления как ошибку, но я считаю, что bash
просто переопределяет более ранние конфликтующие перенаправления, поэтому последнее вступает в силу.
Я протестировал несколько случаев. command < 3.c > 1.c < 4.c > 5.c < 6.c
Если в середине команды возникает ошибка («< 4.c : 4.c файл не существует» или «команда не найдена»), я не уверен, что оставшиеся команды завершатся без их выполнения.
@TomKarzes, что такое конфликтующие перенаправления?
@gigi Тема вашего поста — конфликтующие перенаправления. Если у вас более одного >
или более одного <
, они конфликтуют друг с другом. В некоторых оболочках это ошибка. В bash
он игнорирует все, кроме последнего. Если у вас есть foo > f1 > f2 > f3
, перенаправления стандартного вывода на f1
, f2
и f3
конфликтуют друг с другом. Это то, чего вы обычно хотите избежать. В bash
это эквивалентно foo > f3
. Перенаправление на f1
переопределяется перенаправлением на f2
, которое, в свою очередь, переопределяется перенаправлением на f3
.
@TomKarzes, я не знал о конфликте, спасибо! и конфликтующий случай перенаправления включает другой случай перенаправления (пример foo > f1 < f2 < f3 > f4
)?
@gigi Порядок для них не имеет значения. В этом примере f1
и f4
конфликтуют (оба пытаются перенаправить стандартный вывод), а f2
и f3
конфликтуют (оба пытаются перенаправить стандартный ввод).
Перенаправления оцениваются слева направо. Думайте о >foo
как о stdout=foo. Отсюда перенаправление в
prog >foo >bar
соответствует настройке
stdout=foo
stdout=bar
, что означает, что в целом stdout перенаправляется на bar (например, при установке переменной сначала в одно значение, а затем в какое-то другое значение), но поскольку установка stdout в файл также приводит к созданию этого файла, как foo, так и bar в конце концов будет существовать, хотя в foo ничего не будет записано.
Аналогично,
prog >foo 2>&1 >bar
сделал бы
stdout=foo
stderr=stdout
stdout=bar
и у вас будет stdout для bar и stderr для foo. Конечно, на практике вы бы просто написали prog 2>foo >bar
, чтобы добиться этого эффекта.
Попробуй и увидишь? Все файлы
< arg_x
должны существовать, но ввод будет перенаправлен с последнего. Все файлы> arg_x
будут созданы и усечены, но вывод будет перенаправлен на окончательный.