2016-02-16 2 views
1

я делаю оболочку, которая будет перенаправлять < и> Linux говорит Перенаправление обрабатывается слева направостаршинства редиректа> и <

, но если это так, то следующее не будет работать

1) тройник newOutputFile1 < existingInputFile> newOutputFile2

по странице человека вход первым перезаписан, то выход будет перезаписан, если это правда, то к тому времени, newOutputFile2 получает набор на стандартный тройник бы уже началось, а затем newOutputFile2 было бы Онг.

это то, что я понимаю, что он делает

2) Тройник newOutputFile1 < existingInputFile> newOutputFile2

первый установит newOutputfile2 как стандартный вывод, а затем установить в качестве стандартного ввода содержимого existingInputFile.

, но если это правда, то

3) тройник newOutputFile1> newOutputFile2 < existingInputFile

будет выполнять обратное и ломать вещи.

поэтому, когда есть и < и> он только принимает первый набор stdout, а затем устанавливает stdin?

+1

«к тому времени, когда' newOutputFile2' получит значение 'stdout',' tee' уже запустился. Нет, есть твоя ошибка. Вилка предотвращает испорчение потоков основной оболочки, затем все перенаправления выполняются в порядке слева направо ('freopen'), и последним шагом является использование' exec' для замены дочернего элемента fork исполняемый файл 'tee'. –

ответ

1

Перенаправление разрешено влево-вправо, но перенаправление выполнено до программа выполнена. Так что в этом случае:

  1. existingInputFile открыт для чтения и stdin перенаправляется.
  2. newOutputFile2 открыт для записи (возможно, обрезается) и перенаправляется stdout.
  3. tee newOutputFile1 выполнено. Только после этого tee открывает newOutputFile1 или использует stdin или stdout.