если несколько операторов перенаправления в одной командной строке, как это работает? (bash)

#bash #unix

#bash #unix

Вопрос:

если несколько операторов перенаправления в одной команде. (bash)

  1. тот же оператор перенаправления.
    Пример.
    arg_1 > arg_2 > arg_3 > arg_4
  2. другой оператор перенаправления.
    Пример.
    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 , чтобы добиться этого эффекта.