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

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

  1. тот же оператор перенаправления.
    Пример
    arg_1 > arg_2 > arg_3 > arg_4

  2. другой оператор перенаправления.
    Пример
    arg_1 < arg_2 > arg_3 < arg_4 < arg_5 > arg_6

я знаю, работает ли один оператор перенаправления в команде.

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

Попробуй и увидишь? Все файлы < arg_x должны существовать, но ввод будет перенаправлен с последнего. Все файлы > arg_x будут созданы и усечены, но вывод будет перенаправлен на окончательный.

Ian Abbott 15.12.2020 11:36

Некоторые оболочки рассматривают конфликтующие перенаправления как ошибку, но я считаю, что bash просто переопределяет более ранние конфликтующие перенаправления, поэтому последнее вступает в силу.

Tom Karzes 15.12.2020 11:37

Я протестировал несколько случаев. command < 3.c > 1.c < 4.c > 5.c < 6.c Если в середине команды возникает ошибка («< 4.c : 4.c файл не существует» или «команда не найдена»), я не уверен, что оставшиеся команды завершатся без их выполнения.

gigi 15.12.2020 11:59

@TomKarzes, что такое конфликтующие перенаправления?

gigi 15.12.2020 12:05

@gigi Тема вашего поста — конфликтующие перенаправления. Если у вас более одного > или более одного <, они конфликтуют друг с другом. В некоторых оболочках это ошибка. В bash он игнорирует все, кроме последнего. Если у вас есть foo > f1 > f2 > f3, перенаправления стандартного вывода на f1, f2 и f3 конфликтуют друг с другом. Это то, чего вы обычно хотите избежать. В bash это эквивалентно foo > f3. Перенаправление на f1 переопределяется перенаправлением на f2, которое, в свою очередь, переопределяется перенаправлением на f3.

Tom Karzes 15.12.2020 12:35

@TomKarzes, я не знал о конфликте, спасибо! и конфликтующий случай перенаправления включает другой случай перенаправления (пример foo > f1 < f2 < f3 > f4)?

gigi 16.12.2020 06:09

@gigi Порядок для них не имеет значения. В этом примере f1 и f4 конфликтуют (оба пытаются перенаправить стандартный вывод), а f2 и f3 конфликтуют (оба пытаются перенаправить стандартный ввод).

Tom Karzes 16.12.2020 08:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
436
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Перенаправления оцениваются слева направо. Думайте о >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, чтобы добиться этого эффекта.

Другие вопросы по теме