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